Jump to content

All Activity

This stream auto-updates

  1. Today
  2. https://rathena.org/board/topic/105737-just-when-you-log-in/#comment-363232 check this post
  3. Any idea why this keeps popping? Please Help. Thanks!
  4. Hi, I'm working on a ranking system inspired by League of Legends, and I decided to create these files to apply it to the players I'm new to editing this kind of stuff. I wish a professional could review it and give it a proper cleanup, but anyway, it doesn't seem too bad for now. How do use it: 1) Download League of Legends Rank File. 2) Put into your GRF. 3) Go to your hateffectinfo.lub (data/luafiles514/hateeffectinfo) 4) Search or something Similar. HAT_EF_NightSkyOfRutie = 225, 5) Put this: -- Ranks Lol Tag by Scanty -- HAT_IRON_RANK = 231, HAT_BRONCE_RANK = 232, HAT_PLATA_RANK = 233, HAT_ORO_RANK = 234, HAT_PLATINO_RANK = 235, HAT_ESMERALDA_RANK = 236, HAT_DIAMANTE_RANK = 237, HAT_MAESTRO_RANK = 238, HAT_GM_RANK = 239, HAT_RETADOR_RANK = 240, 6) Now, Search for [HatEFID.HAT_EF_NightSkyOfRutie] = { resourceFileName = "efst_NightSkyOfRutie\\christmasx3.str", hatEffectPos = -11, hatEffectPosX = -0.3, isRenderBeforeCharacter = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true }, 7) After that --- Inician Rangos de Lol - By Scanty --- [HatEFID.HAT_IRON_RANK] = { resourceFileName = "custom\\rangos_lol\\iron_RANK.str",hatEffectPos = 6, isIgnoreRiding = false, isRenderBeforeCharacter = false, isAttachedHead = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true}, [HatEFID.HAT_BRONCE_RANK] = { resourceFileName = "custom\\rangos_lol\\bronce_RANK.str",hatEffectPos = 6, isIgnoreRiding = false, isRenderBeforeCharacter = false, isAttachedHead = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true}, [HatEFID.HAT_PLATA_RANK] = { resourceFileName = "custom\\rangos_lol\\plata_RANK.str",hatEffectPos = 6, isIgnoreRiding = false, isRenderBeforeCharacter = false, isAttachedHead = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true}, [HatEFID.HAT_ORO_RANK] = { resourceFileName = "custom\\rangos_lol\\oro_RANK.str",hatEffectPos = 6, isIgnoreRiding = false, isRenderBeforeCharacter = false, isAttachedHead = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true}, [HatEFID.HAT_PLATINO_RANK] = { resourceFileName = "custom\\rangos_lol\\platino_RANK.str",hatEffectPos = 6, isIgnoreRiding = false, isRenderBeforeCharacter = false, isAttachedHead = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true}, [HatEFID.HAT_ESMERALDA_RANK] = { resourceFileName = "custom\\rangos_lol\\esmeralda_RANK.str",hatEffectPos = 6, isIgnoreRiding = false, isRenderBeforeCharacter = false, isAttachedHead = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true}, [HatEFID.HAT_DIAMANTE_RANK] = { resourceFileName = "custom\\rangos_lol\\diamante_RANK.str",hatEffectPos = 6, isIgnoreRiding = false, isRenderBeforeCharacter = false, isAttachedHead = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true}, [HatEFID.HAT_MAESTRO_RANK] = { resourceFileName = "custom\\rangos_lol\\maestro_RANK.str",hatEffectPos = 6, isIgnoreRiding = false, isRenderBeforeCharacter = false, isAttachedHead = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true}, [HatEFID.HAT_GM_RANK] = { resourceFileName = "custom\\rangos_lol\\GM_RANK.str",hatEffectPos = 6, isIgnoreRiding = false, isRenderBeforeCharacter = false, isAttachedHead = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true}, [HatEFID.HAT_RETADOR_RANK] = { resourceFileName = "custom\\rangos_lol\\Retador_RANK.str",hatEffectPos = 6, isIgnoreRiding = false, isRenderBeforeCharacter = false, isAttachedHead = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true} 8 ) Create a script to test. you need to use this: hateffect 240, true; *hateffect(<Hat Effect ID>,<State>); This will set a Hat Effect onto the player. The state field allows you to enable (true) or disable (false) the effect on the player. The Hat Effect constants can be found in 'src/map/script_constants.hpp' starting with HAT_EF_*. Requires client 2015-05-13aRagEXE or newer. League of Legends Rank.rar
  5. For me, works like you have, but maybe your SQL have something. Try this. .@query$ = "SELECT `char`.`char_id`, `char`.`name`, `char`.`guild_id`, `char`.`class`, " + "`char`.`sex`, `char`.`hair`, `char`.`hair_color`, `char`.`clothes_color`, " + "`char`.`body`, `char`.`head_top`, `char`.`head_mid`, `char`.`head_bottom`, `char`.`robe`, " + "SUM(`mvpladder`.`kills`) AS `orderKills` " + "FROM `char` " + "RIGHT JOIN `mvpladder` ON `char`.`char_id` = `mvpladder`.`char_id` " + "GROUP BY `char`.`char_id`, `char`.`name`, `char`.`guild_id`, `char`.`class`, `char`.`sex`, " + "`char`.`hair`, `char`.`hair_color`, `char`.`clothes_color`, `char`.`body`, " + "`char`.`head_top`, `char`.`head_mid`, `char`.`head_bottom`, `char`.`robe` " + "ORDER BY `orderKills` DESC LIMIT " + .showstatue + ";";
  6. // LOJA DE MVP POINTS - pointshop Shop_MVPPOINTS -1,#MVPPOINTS,501:10,502:10,503:10,504:10,505:10,506:10 //---- MvP Ladder Logic Script - script mvpladder -1,{ OnInit: // Configurações .map_killannounce = 0; // anunciar quando o MVP é morto no mapa onde o MVP foi morto: 0 - desativado, 1 - ativado .killannounce = 1; // anunciar quando o MVP é morto globalmente: 0 - desativado, 1 - ativado .gmnokill = 0; // GMs não devem matar MVPs. Um GM com nível <este número> ou superior não fará nada. Se definido como 60, GMs de nível 60 ou superior não receberão nada ao matar jogadores: 0 - desativado .min_gm_menu = 90; // nível mínimo do GM que pode usar o menu do GM no NPC da escada .showtotal = 10; // mostrar o comprimento da escada. .showpage = 10; // definir as visualizações por página. .showstatue = 3; // número de estátuas. Este número deve corresponder ao número de duplicatas no final do script. .fix_custom_sprite = true; // se o seu servidor tem sprites animados personalizados que se sobrepõem à animação da estátua repetidamente, ative isso // Config ends ------------------------------------------------------------------------------------------ //// to prevent bug happen // if (.gmnokill <= 0) .gmnokill = 100; // // sleep 1; OnTimer10000: // refresh statues every 1 minute. Note the `char` table is unrealiable, player still need to perform certain task to save the character -> see 'save_settings' in conf\map-server.conf .@query$ = "SELECT `char`.`char_id`, `char`.`name`, `char`.`guild_id`, `char`.`class`, " + "`char`.`sex`, `char`.`hair`, `char`.`hair_color`, `char`.`clothes_color`, " + "`char`.`body`, `char`.`head_top`, `char`.`head_mid`, `char`.`head_bottom`, `char`.`robe`, " + "SUM(`mvpladder`.`kills`) as `orderKills` " + "FROM `char` RIGHT JOIN `mvpladder` ON `char`.`char_id` = `mvpladder`.`char_id` GROUP BY `char`.`char_id` ORDER BY `orderKills` DESC LIMIT " + .showstatue; .@nb = query_sql(.@query$, .@cid, .@name$, .@guild_id, .@class, .@sex$, .@hair, .@hair_color, .@clothes_color, .@body, .@head_top, .@head_mid, .@head_bottom, .@robe, .@kills); if (.fix_custom_sprite) { for (.@i = 0; .@i < .@nb; ++.@i) { setunitdata .statue[.@i +1], UNPC_HEADTOP, 0; setunitdata .statue[.@i +1], UNPC_HEADMIDDLE, 0; setunitdata .statue[.@i +1], UNPC_HEADBOTTOM, 0; setunitdata .statue[.@i +1], UNPC_ROBE, 0; } } for (.@i = 0; .@i < .@nb; ++.@i) { setunitdata .statue[.@i +1], UNPC_CLASS, .@class[.@i]; setunitdata .statue[.@i +1], UNPC_SEX, (.@sex$[.@i] == "F")? SEX_FEMALE:SEX_MALE; setunitdata .statue[.@i +1], UNPC_HAIRSTYLE, .@hair[.@i]; setunitdata .statue[.@i +1], UNPC_HAIRCOLOR, .@hair_color[.@i]; setunitdata .statue[.@i +1], UNPC_CLOTHCOLOR, .@clothes_color[.@i]; setunitdata .statue[.@i +1], UNPC_BODY2, .@body[.@i]; setunitdata .statue[.@i +1], UNPC_HEADTOP, .@head_top[.@i]; setunitdata .statue[.@i +1], UNPC_HEADMIDDLE, .@head_mid[.@i]; setunitdata .statue[.@i +1], UNPC_HEADBOTTOM, .@head_bottom[.@i]; setunitdata .statue[.@i +1], UNPC_ROBE, .@robe[.@i]; setnpcdisplay "mvp_ladder_statue#"+(.@i +1), .@name$[.@i]; .statue_name$[.@i +1] = .@name$[.@i]; .statue_guild$[.@i +1] = getguildname(.@guild_id[.@i]); .statue_kills[.@i +1] = .@kills[.@i]; } for (.@i = .@nb; .@i < .showstatue; ++.@i) setunitdata .statue[.@i +1], UNPC_CLASS, HIDDEN_WARP_NPC; initnpctimer; end; OnNPCKillEvent: // Logic to detect when a MvP is killed if(getgmlevel() < 3) { if (getmonsterinfo(killedrid, MOB_MVPEXP) > 0) { announce "[ Ranking MVP ] : O jogador ["+ strcharinfo(0) +"] do grupo ["+ strcharinfo(1) +"] acaba de matar o MVP "+ getmonsterinfo( killedrid, MOB_NAME ) +" em "+ strcharinfo(3), bc_all; .@selectIfKillExistQuery$ = "SELECT char_id, mob_id, kills FROM mvpladder WHERE char_id = '" + getcharid(0) + "' AND mob_id = '" + killedrid + "';"; if (query_sql(.@selectIfKillExistQuery$) > 0) { // Exist a kill of that MVP so +1 to kill count .@updateLadderQuery$ = "UPDATE mvpladder SET kills = kills + 1 WHERE char_id = '" + getcharid(0) + "' AND mob_id = '" + killedrid + "'"; } else { // Create a new kill of specific MVP //.@updateLadderQuery$ = "INSERT INTO mvpladder (char_id, mob_id, kills) VALUES ('" + getcharid(0) + "','" + killedrid + "','1');"; .@updateLadderQuery$ = "INSERT INTO mvpladder (`char_id` , `mob_id` , `kills`) VALUES ('" + getcharid(0) + "','" + killedrid + "','1');"; } query_sql(.@updateLadderQuery$); } } end; } //Pontos MVP - script mvppoint01 -1,{ OnNPCKillEvent: setarray .@monsterID[0],1038,1039,1046,1059,1086,1087,1112,1115,1147,1150,1157,1159,1190,1251,1252,1272,1312,1373,1389,1418,1492,1511,1583,1623,1630,1658,1685,1688,1719,1785,1885,2068,1957; // ID Dos Boss for(set @a,0; @a <= getarraysize(.@monsterID); set @a,@a+1) if(killedrid == .@monsterID[@a]){ set #MVPPOINTS,#MVPPOINTS+1; message strcharinfo(0),"[RagnaUp]: Você possui "+#MVPPOINTS+" ponto(s) de MvPs."; if (rand(1000) < 10){ getitem 45000,1; announce "O jogador "+strcharinfo(0)+" acaba de dropar Cash Eletrônico do MVP "+ getmonsterinfo( .@monsterID[@a], MOB_NAME ) +"!",0; } } } - script mvppoint03 -1,{ OnNPCKillEvent: setarray .@monsterID[0],1708,1734,1751,1768,1779,1832,1871,1917; // ID Dos Boss for(set @a,0; @a <= getarraysize(.@monsterID); set @a,@a+1) if(killedrid == .@monsterID[@a]){ set #MVPPOINTS,#MVPPOINTS+15; message strcharinfo(0),"[RagnaUp]: Você possui "+#MVPPOINTS+" ponto(s) de MvPs."; if (rand(1000) < 50){ getitem 45000,1; announce "O jogador "+strcharinfo(0)+" acaba de dropar Cash Eletrônico do MVP "+ getmonsterinfo( .@monsterID[@a], MOB_NAME ) +"!",0; } } } - script mvppoint05 -1,{ OnNPCKillEvent: setarray .@monsterID[0],1646,1647,1648,1649,1650,1651,1874,1929,1956,2022; // ID Dos Boss for(set @a,0; @a <= getarraysize(.@monsterID); set @a,@a+1) if(killedrid == .@monsterID[@a]){ set #MVPPOINTS,#MVPPOINTS+30; message strcharinfo(0),"[RagnaUp]: Você possui "+#MVPPOINTS+" ponto(s) de MvPs."; if (rand(1000) < 100){ getitem 45000,1; announce "O jogador "+strcharinfo(0)+" acaba de dropar Cash Eletrônico do MVP "+ getmonsterinfo( .@monsterID[@a], MOB_NAME ) +"!",0; } } } //---- Informações do NPC Lider MVP prontera,122,135,5 script Caçador de MVP 733,{ .@npcname$ = strnpcinfo(0); while (1) { mes "["+ .@npcname$ +"]"; mes "Olá ^A020F0"+ strcharinfo(0) +"^000000..."; mes "Você tem atualmente ^0000ff"+#MVPPOINTS+"^000000 Pontos MVP."; next; switch (select("^339966[»]^000000 Ranking MVP","^008aff[»]^000000 MVPs mais Caçados","^A020F0[»]^000000 Abrir a Loja")) { case 1: mes "^FF0000O ranking é resetado todo dia 01.^000000"; mes ""; .@queryKillerList$ = "SELECT t1.char_id, SUM(t1.kills) as `orderKills`, t2.name " + "FROM `mvpladder` t1 " + "INNER JOIN `char` t2 " + "ON t1.char_id = t2.char_id " + "GROUP BY t1.char_id " + "ORDER BY `orderKills` DESC " + "LIMIT " + getvariableofnpc(.showtotal, "mvpladder") + ";"; .@nb = query_sql(.@queryKillerList$, .@charid, .@kills, .@name$); if (!.@nb) { mes "O Ranking está vazio no momento."; next; } for (.@j = 0; .@j < .@nb; .@j += getvariableofnpc(.showpage,"mvpladder")) { for (.@i = .@j; .@i < (getvariableofnpc(.showpage,"mvpladder") + .@j) && .@i < .@nb; ++.@i) mes "^996600" + (.@i+1) + ": ^006699" + .@name$[.@i] + " - ^00AA00[" + .@kills[.@i] + "]^FF0000 MVPs Mortos^000000"; next; } break; case 2: .@queryKilledList$ = "SELECT char_id, mob_id, SUM(kills) as `orderKills` " + "FROM `mvpladder` " + "GROUP BY mob_id " + "ORDER BY `orderKills` DESC " + "LIMIT " + getvariableofnpc(.showtotal, "mvpladder") + ";"; .@nb = query_sql(.@queryKilledList$, .@charid, .@mobid, .@kills); if (!.@nb) { mes "O top está vazio no momento."; next; } for (.@j = 0; .@j < .@nb; .@j += getvariableofnpc(.showpage,"mvpladder")) { for (.@i = .@j; .@i < (getvariableofnpc(.showpage,"mvpladder") + .@j) && .@i < .@nb; ++.@i) { mes "^996600" + (.@i+1) + ": ^006699" + getmonsterinfo(.@mobid[.@i], 1) + " ^FF0000MVP ^00AA00[Morto ^FF0000" + .@kills[.@i] + " ^00AA00Vezes]^000000"; } next; } query_sql("SELECT SUM(kills) FROM mvpladder;", .@killCount); mes "^996600==> ^006699Total de MVPs Mortos [^00AA00" + .@killCount[0] + "^000000^006699]^FF0000"; break; case 3: dispbottom "Você tem "+#MVPPOINTS+" Pontos de MVP."; close2; callshop "Shop_MVPPOINTS"; end; } OnInit: initnpctimer; setunittitle(getnpcid(0), "[ Ranking e Loja ]"); end; OnTimer10000: showscript("Líder MVP"); setnpctimer 0; end; } close; } //---- MSG board NPCs - script mvp_ladder_statue -1,{ .@id = getelementofarray(getvariableofnpc(.npcgid, "mvpladder"), getnpcid(0)); mes "^996600[TOP MVP "+ .@id +"]"; mes "^006699Nome: "+ getelementofarray(getvariableofnpc(.statue_name$, "mvpladder"), .@id); .@guildname$ = getelementofarray(getvariableofnpc(.statue_guild$, "mvpladder"), .@id); mes "^00AAAAGuild: "+((.@guildname$ == "null")? "^AAAAAANone": .@guildname$); mes "^00AA00Matou: ["+ getelementofarray(getvariableofnpc(.statue_kills, "mvpladder"), .@id) +"]"; close; OnInit: .@id = strnpcinfo(2); set getvariableofnpc(.statue[.@id], "mvpladder"), getnpcid(0); set getvariableofnpc(.npcgid[getnpcid(0)], "mvpladder"), .@id; end; } prontera,127,138,4 duplicate(mvp_ladder_statue) mvp_ladder_statue#1 1_F_MARIA prontera,124,141,4 duplicate(mvp_ladder_statue) mvp_ladder_statue#2 1_F_MARIA prontera,130,141,4 duplicate(mvp_ladder_statue) mvp_ladder_statue#3 1_F_MARIA //== clone base prontera,127,138,2 script #2 844,{ end; OnInit: while(1) { specialeffect EF_MVP; sleep 10000; } } //prontera,172,204,2 script #npcuniquename PORTAL,{} //prontera,140,180,5 script #npcuniquename1 PORTAL,{} //prontera,138,182,2 script #npcuniquename2 PORTAL,{} //== msg top da cabeça prontera,127,138,4 script #top1 111,{ OnInit: initnpctimer; end; OnTimer1000: showscript("Top-1 MVP"); setnpctimer 0; end; } prontera,124,141,4 script #top2 111,{ OnInit: initnpctimer; end; OnTimer1000: showscript("Top-2 MVP"); setnpctimer 0; end; } prontera,130,141,4 script #top3 111,{ OnInit: initnpctimer; end; OnTimer1000: showscript("Top-3 MVP"); setnpctimer 0; end; } - script reset_ranking -1,{ OnClock0005: if(gettime(DT_DAYOFMONTH) == 1){ query_sql ("TRUNCATE `mvpladder`"); end; } OnInit: bindatcmd "resetrankingmvp", strnpcinfo(0) +"::OnReset"; end; OnReset: if (getgmlevel() > 98) { query_sql ("TRUNCATE `mvpladder`"); dispbottom "Ranking MVP resetado com sucesso!"; end; } else { dispbottom "Somente Administradores podem usar este comando"; end; } end; } I have a warning problem whenever a player defeats an MVP. Can someone help me with this problem? The error line is below: [Warning]: script:query_sql: Too many columns, discarding last 3 columns.
  7. I’m having same issue it’s something either the view id mostly accessoryid file in the client.
  8. Recursos do Script: ✔ Configuração personalizável (prêmios, taxas de sorteio, mensagens). ✔ Múltiplos modos de uso (roleta diária, por pontos, evento especial). ✔ Suporte a itens customizados (VIP, itens exclusivos, zeny, etc.). ✔ Sistema de logs (registro de ganhadores e premiações). ✔ Compatível com rAthena/Hercules (testado e otimizado). ✔ Painel de controle intuitivo (facilidade para editar prêmios).
  9. Hello. I found this script: Herc - Event Wheel of Fortune So i decide to use it. All credits to him: Habilis. Here's my edited Script: And this is my Frames. Route: data\texture\À¯ÀúÀÎÅÍÆäÀ̽º\cardbmp\ruleta_suerte But you can change it via script. OnInit: set .Cutin$, "ruleta_suerte\\frame_"; <-- CHANGE this "This is my own modification. You can change everything through the script, and of course… you'll need the design. But hey, you can do it yourself! I downloaded Photoshop just an hour ago and made this, lol (no editing knowledge at all)." If you’ve got your own design and want to create frames like I did, here’s what I did Please don't ask anything about design and stuff, I'm still learning. Odin Wheel: This is just an example. If you want it to be an automated event or something like that, feel free to ask! Video: Frames.rar Ruleta+PSD+Gen_FramE.rar Odin_Wheel.rar
  10. its make me interesting, i will try make it, then after last night i make 2 npc for that lol, for make milk and egg its have progses bar, with time 10 sec , and have change random failed or suces; sory my bad english This is an example of a trade map between cities, later I will make: 1, each city will have its own commodity goods 2, each item between cities will change its price like supply and demand, abundant goods will go down, few goods will go up 3. Players will escort the delivery of goods, and can be attacked by monsters, I think this script already exists but I forgot where, we add it when actively escorting goods, the teleport feature from Kafra will not work, except for storing goods and save points that are still working 4. The commodity goods are divided into those sold by NPCs, drop items, and brew items and crafting from NPCs that have been provided; 5. Most of me follow your ideas, my friend, but I make it my own way, maybe by adding or I don't know how it will turn out later. and all of that is very fun
  11. Unfortunately, OnPCAttackEvent alone doesn't give you all the context you need. You might consider combining OnPCAttackEvent with a timer or periodic check to aggregate attack data. Use src mod for better tracking. If you're open to modifying the source (src), you could implement a true anti-gank system by tracking attackers on the target side, which is more reliable.
  12. 1. Unlimited Chain Quest - Monster Hunting / Item Collection in 1 NPC 2. Music Player - Just for fun 3. Race to Max Level - Perfect for single-time race events! 4. Beta Registration NPC - Easy handing out rewards NOTE: No support will be provided - unless it's a bug in the script itself Bugs? Reply to this thread and I'll fix it right up.
  13. В метро на информационном стенде увидел [url=https://telegra.ph/CHto-budet-posle-smerti-03-07]философские размышления о вечности[/url]. Ритуальные услуги оказаны на высоком уровне. Сотрудники работают профессионально.
  14. Yesterday
  15. Looking good so far, keep it up! Hope it can be released one way or another in the future
  16. Change the skill duration 10000 to 600 in skill_db.yml - Id: 86 Name: WZ_WATERBALL Description: Water Ball MaxLevel: 5 Type: Magic TargetType: Attack Flags: IsAutoShadowSpell: true Range: 9 Hit: Multi_Hit HitCount: 1 Element: Water CopyFlags: Skill: Plagiarism: true Reproduce: true CastTime: - Level: 1 Time: 1000 - Level: 2 Time: 2000 - Level: 3 Time: 3000 - Level: 4 Time: 4000 - Level: 5 Time: 5000 - Level: 6 Time: 6000 - Level: 7 Time: 7000 - Level: 8 Time: 8000 - Level: 9 Time: 9000 - Level: 10 Time: 10000 Duration1: 10000
  17. Thank you very much sir! I appreciate. Will try ASAP.
  18. Hello //===== rAthena Script ===========================================| //= Mr.Secrets DressRoom - Custom Request //= 1.5 Added 4th job sprites and item requirements [Racaae] //= https://rathena.org/board/topic/144504-mrsecrets-dressroom-custom-request morocc,167,95,4 script Dress Room#sc 2_M_DYEINGER,{ function RestrictClass; function HasjROCostume; function ChangeAppr; function RestrictClass { .@eaj = eaclass(); if(.@eaj&EAJ_BASEMASK == EAJ_NOVICE) return 0; if(.@eaj&EAJL_2 && roclass(.@eaj|EAJL_UPPER) != -1){ return 1; } return 0; } function HasjROCostume { switch(roclass(eaclass()&EAJ_THIRDMASK|EAJL_THIRD)) { case Job_Guillotine_Cross: case Job_Genetic: case Job_Royal_Guard: case Job_Arch_Bishop: case Job_Mechanic: case Job_Ranger: case Job_Minstrel: case Job_Wanderer: case Job_Warlock: // Uncomment lines below to enable certain job when their respective jRO costume is released and you patched the sprite in your client. //case Job_Sorcerer: //case Job_Sura: //case Job_Rune_Knight: return 1; default: return 0; } } function ChangeAppr { mes .n$; if (Zeny < .cost_dressroom) { mes "You don't have enough Zeny."; .@missingzeny = true; } .@size = getarraysize(.cost_item); if (.@size > 1) { for ( .@i = 0; .@i < .@size; .@i += 2 ) { if (countitem(.cost_item[.@i]) < .cost_item[.@i+1]) { if (!.@missingitem) { mes "You didn't bring what I need. You're missing:"; .@missingitem = true; } mes .cost_item[.@i+1] + "x " + mesitemlink(.cost_item[.@i]); } } } if (.@missingzeny || .@missingitem) close; switch(getarg(1)){ case 0: // Normal Mode setlook LOOK_BODY2,0; changebase getarg(0); set baselook, getarg(0); break; case 1: // jRO Mode if(!HasjROCostume()) return; changebase roclass(eaclass()&EAJ_THIRDMASK|EAJL_THIRD); setlook LOOK_CLOTHES_COLOR,0; setlook LOOK_BODY2,!(getlook(LOOK_BODY2)); //atcommand "@bodystyle " + !(getlook(LOOK_BODY2)); baselook = 0; break; } Zeny -= .cost_dressroom; .@size = getarraysize(.cost_item); if (.@size > 1) { for ( .@i = 0; .@i < .@size; .@i += 2 ) delitem .cost_item[.@i], .cost_item[.@i+1]; } mes "Here you are!"; close; } .@TYPE_CHANGEBASE = 0; .@TYPE_SETLOOK = 1; mes .n$; if (!RestrictClass()){ mes "Your class isn't allowed to use my services."; close; } mes "I can change your appearance to another class of your classline!"; if (HasjROCostume()){ mes "I also have a brand new costume for your class!"; } next; mes .n$; if (.cost_dressroom) mes "At a cost of ^FF0000" + F_InsertComma(.cost_dressroom) + "^000000z"; //displaying needed item list .@size = getarraysize(.cost_item); if (.@size > 1) { for ( .@i = 0; .@i < .@size; .@i += 2 ) mes (.@i+3>.@size?"And ":"") + .cost_item[.@i+1] + "x " + mesitemlink(.cost_item[.@i]); } mes "Which class do you want to change your appearance to?"; next; .@option[0] = roclass(eaclass()&EAJ_UPPERMASK); .@option[1] = roclass(eaclass()&EAJ_UPPERMASK|EAJL_UPPER); .@option[2] = roclass(eaclass()&EAJ_THIRDMASK|EAJL_THIRD); if (.4th) { .@job = roclass(eaclass()&EAJ_THIRDMASK|EAJL_THIRD); .@option[4] = roclass(eaclass(.@job)|EAJL_FOURTH|EAJL_UPPER); } for(.@i = 0; .@i < (.4th?5:4); .@i++) { if (!.@option[.@i] && HasjROCostume() && !getlook(LOOK_BODY2) && .@option[.@i] != baselook) .@menu$ += "New jRO " + jobname(.@option[2]) + " costume"; else if (.@option[.@i] > 0 && .@option[.@i] != baselook) { if (roclass(eaclass()) == .@option[.@i]) .@menu$ += "Restore " + jobname(.@option[.@i]) + " costume"; else .@menu$ += jobname(.@option[.@i]); } .@menu$ += ":"; } if(select(.@menu$)-1 == 3) { //jRO costume ChangeAppr(0,.@TYPE_SETLOOK); } ChangeAppr(.@option[@menu-1],.@TYPE_CHANGEBASE); end; OnPCLoginEvent: if(baselook && .dress_perma){ changebase baselook; } end; OnInit: .n$ = "[Dress Room]"; // NPC Name .dress_perma = 1; //Changes are saved when player logout (1=Yes / 0=No) .4th = true; //Enable changing to 4th job sprite (True / False) .cost_dressroom = 10000; // Zeny Cost setarray .cost_item,6959,1,982,3,983,2; // Item cost - item ID,Amount,item ID,Amount... end; }
  19. ah dati kasi uso pa converter ngaun kc s grf editor di mo na need ngconverter makikita mo nadin agad yung sprite dun
  20. Thanks again Tokei, it was the GRF Editor Version, I was doing everything right except for the basic, use the latest version xD
  21. Thanks, I'll check the version of the GRF editor and try some of your tips. The order of the grfs is correct, I always leave mine in position 0=file.grf. Regarding the merge of the grfs, I was manually adding the map files into my grf and saving. There are only two maps I'm trying to create so I didn't see any reason to use the merge option: nif_fild03 and moc_akhet. Another question, since the grf I'm currently using I got from someone else, it already has its own textures, is it possible for me to create the map file and use only the generated GAT, RSW and GND or will the changes I make to the texture colors in the GRF editor cause my game to close like it is happening?
  22. Hello, The easiest way to add new maps is the following: Make sure to update GRF Editor to its latest version (currently on 1.8.9.7, you can use the rAthena page and follow the mediafire link or here: https://www.mediafire.com/file/aflylbhblrzpz0h/ ) Find the new maps in your GRF and then extract the RSW, GND and GAT files. Preferably, use an official GRF since your server's GRF may be encrypted. You can easily test that out by trying to preview the map in GRF Editor. If it doesn't want to load or it throws errors, then the map is encrypted. Open the flat maps maker tool and open the input maps folder by clicking the green arrow: Put the map files you previously extracted in that folder, make sure "Use currently opened GRF" is not checked. If you're using the latest GRF Editor version, you'll get a preview on the right side. You can customize the output rather easily in the options, that part is entirely up to you. Optional. The textures will overwrite the original ones; if that's a concern for you, you can set a unique set of textures for your own map in Options > Maps unique ID (set it to "mine_"). Now generate the gray maps, and you'll get a maps.grf file. You can either add an extra entry in your data.ini file with your new GRF name, or you can merge the two gray map GRFs with the Edit > Merge option. If any error shows up, it will be displayed in the console in the "Generate maps" tab. Now, the reason for your crash is a bit vague. Here are a few possible reasons: You used an old version of GRF Editor or your maps were too recent (kRO released a new map version a while back). Either way, updating GRF Editor will fix that issue. Your GRF priority is wrong in your data.ini. Your maps.grf should have one of the highest priority, so something like: [Data] 0=gepard.grf 1=maps.grf 2=yourserver.grf 3=data.grf You may not have merged the GRF correctly? Not sure how that would crash you though... I can't think of another reason. If the issue persists, can you tell me the map name? I'll just test it on my end to make sure.
  23. Thanks to a friend, I managed to make the Water Ball skill work outside of water, but it is too strong, and I would like to nerf it a little if possible. Can anyone tell me how I can reduce the number of hits of this skill? From 25 to 10 or 5? Below I send the code that made it work out of water: case WZ_WATERBALL: // Check if there are cells that can be turned into waterball units if (!sd || map_getcell(src->m, ux, uy, CELL_CHKWATER)) { break; // There is no water to create the skill } // Allows the skill to be activated on top of SA_DELUGE and NJ_SUITON without consuming cells if ((map_find_skill_unit_oncell(src, ux, uy, SA_DELUGE, nullptr, 1)) != nullptr || (map_find_skill_unit_oncell(src, ux, uy, NJ_SUITON, nullptr, 1)) != nullptr) { // The cell contains Deluge or Suiton, so the skill is activated, but the cell is not consumed // It just allows you to continue without the cell removal mechanic continue; } // Normal cell consumption process (otherwise) unit = map_find_skill_unit_oncell(src, ux, uy, WZ_WATERBALL, nullptr, 0); i f (unit) skill_delunit(unit); // Remove the Waterball cell only if it is not Deluge or Suiton
  1. Load more activity
×
×
  • Create New...