Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation since 03/19/24 in all areas

  1. Froggo Rö Folder This is a simple RO folder that contains everything you need to run a 2022-04-06 client, the latest publicly available. I have cleaned and compressed the data.grf file to reduce its size from 3.47GB to 2.44GB. I have also compressed the official_data.grf file from 1.24GB to 477MB. Before BGM, the Rö folder has a total size of 2.96GB, after BGM it reaches 3.30GB Screenshots Requirements Server Up & Running with ‎‏‏‎ PACKETVER=20220406 Visual C++ Redistributables DirectX Runtime Features Includes latest RoEnglishRE - 16/mar/2024 Custom Lua Support jRO Enchantment Display Includes rsu-kro-rag-lite (kRO updater) - v4.2.2.1316 Includes opensetup - v3.1.0.627 Includes iRO's Setup.exe, thanks to relzz! Includes AzzyAI 1.55 Includes Packet Viewer Download click here to download a .zip file of this ro-folder Extra Warp Profile for 2022-04-06 used for FroggoClient.exe (mirror) 2022-04-06 Vanilla Ragexe Client Login Screen Creator Official Ragnarok Complete Installer (08/Jan/2024)(mirror) Froggö Ro Folder Gitlab's Repo FAQ Why am I getting CHARACTER_INFO size error when trying to log in? Possible reasons: You are using outdated rAthena which doesn't work with 2022-04-06 client. You haven't set correct PACKETVER or done it with mistakes (skill issue ). You haven't recompiled rAthena. You haven't restarted server after recompilation. Why am I getting errors about MSVCP140.dll, VCRUNTIME140.dll when executing FroggoClient.exe? You haven't installed Visual C++ Redist, check requirements section, if problem persists, try installing this too Visual C++ Redist for VS 2012u4 What is official_data.grf ? official_data.grf is from the ROResourceCollection project, which brings many items, mobs and npc files from other RO Regions and merges it into one convenient grf. Why does the Setup.exe opens instead of the FroggoClient.exe? In your Windows registry there is no data about your selected graphic card, to fix it, just set up your settings in Setup.exe and click on OK, be aware to don't select DirectX9, stay on DirectX7 What was removed from the data.grf? Several unnecessary files were removed from the data.grf . These included residual files such as thumbs.db and stray BMP Screenshots. However, the majority of the cleanup was performed in the mob and npc sprite folders. In these folders, some .spr files contained sprites (images) that were not utilized in their corresponding .act files. For example, the monster katrinn's .spr file contained approximately 140 images, but only 6 of them were actually used. In total, out of nearly 90,000 collective images, around 9,400 were removed alv.
    7 points
  2. Let's continue to explore new horizons in mapping! A seamless map containing the entire island of Angrboda, where the place of worship of the god Odin is located. The island can be used for a Battle Royale in the RO lore, for other events or as a replacement for the standard three locations. The map size is 400x400 tiles or 800x800 cells. .•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•. odin1map video: Lighting and shadows have been completely restored. In addition, local lighting has been added in various places. Since the map was created for special modes, the places available to players have been expanded. So the huge hill between the first and second areas was completely opened, and a coastal zone was added in the second area. Passages, descents and ascents were also added. The bridge connects the areas. Especially for the Battle Royale mode, shooting and using skills from lowlands and hills is allowed.
    4 points
  3. Do you have very old clients or emulators lying around? Maybe that old hard drive with RO stuff? How about those old CD-Rs on the shelf? Or are you simply a RO data hoarder? WE WANT YOU! Hi, I’m vit. I’m developing along with o oldinroplayer a *Ragnarok Online Cross-Episode Database*, called RagnaDB. It’s a db in which you’re able to choose a specific episode and we’ll show you all the info precisely as it was back in the day. The idea is for it to be the “one RO database to rule them all”. For this to exist, there’s a great deal of historical research and digital data scavenging involved. Since we’re committed to historical accuracy, we’re on a journey to finding old files (client and server) to feed the db with, as well as (old) reliable sources for data validation. If you were waiting for the right moment to shine and looking for a group of people who will truly appreciate and see value in those dozens of RO gigabytes collecting dust like no one ever had, this is the moment! We’ll love to have you! If any of the words above piqued your interest, you’re more than welcome here. Join our Discord to hear about the latest updates or just hang around! Our Discord: https://discord.gg/cueAdED64N RagnaDB: https://ragnadb.com/
    4 points
  4. Version 1.0.0

    114 downloads

    [Event] Chess 1.0 By: MihaSenpai About: Hello Everynyan! My name is Mihael and I hope you are all well. I recently found these files in a personal repository and decided to share them with you. The .ZIP Contains the files: Script: NPC programmed for two players to participate in a game of chess. Map: Files containing the original Map of the event. Sprites: Files containing the event's ORIGINAL NPC Sprites. Hope you like it. If you have any questions, you can contact us here on the Forum or via Discord. A belated Happy 2024 to everyone.
    Free
    4 points
  5. 1. rathena/src/map/script.hpp Search: HAT_EF_MAX Replace: /* Custom Hateffects */ HAT_EF_arcane_aura_A, HAT_EF_arcane_aura_B, HAT_EF_gluttony_aura_A, HAT_EF_gluttony_aura_B, HAT_EF_MAX = 9999 2. rathena/src/map/script_constants.hpp Search: export_constant(HAT_EF_EFST_C_20TH_ANNIVERSARY_HAT); Replace: export_constant(HAT_EF_EFST_C_20TH_ANNIVERSARY_HAT); /* Custom Hateffects */ export_constant(HAT_EF_arcane_aura_A); export_constant(HAT_EF_arcane_aura_B); export_constant(HAT_EF_gluttony_aura_A); export_constant(HAT_EF_gluttony_aura_B); 3. Compile you Server. 4. Copy in you Data/texture/effect/(arcane_aura) and (gluttony_aura) Data(Example_Auras).zip 5. Data/luafiles514/lua files/hateffectinfo/hateffectinfo.lub Search: HAT_EF_efst_C_20th_Anniversary_Hat = 176 } Replace: HAT_EF_efst_C_20th_Anniversary_Hat = 176, HAT_EF_arcane_aura_A = 177, HAT_EF_arcane_aura_B = 178, HAT_EF_gluttony_aura_A = 179, HAT_EF_gluttony_aura_B = 180 } resourceFileName: route effect(Data/effect/name you effect folder/name you str file.str) IsIgnoreRiding: if true when mounting a mount or asking for hateffect will not go up, it will ignore this action isRenderBeforeCharacter: If true when using hateffect it will be over the character. hatEffectPos: Position the Y anchor (up and down) of the hateffect hatEffectPosX: Positions hateffect X anchor (left right) isAdjustPositionWhenShrinkState: always true isAdjustSizeWhenShrinkState: always true Search: [HatEFID.HAT_EF_efst_C_20th_Anniversary_Hat] = { resourceFileName = "efst_C_20th_Anniversary_Hat\\20th_f.str", hatEffectPos = -6, hatEffectPosX = 0, isIgnoreRiding = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true } } Replace: [HatEFID.HAT_EF_efst_C_20th_Anniversary_Hat] = { resourceFileName = "efst_C_20th_Anniversary_Hat\\20th_f.str", hatEffectPos = -6, hatEffectPosX = 0, isIgnoreRiding = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true }, [HatEFID.HAT_EF_arcane_aura_A] = { resourceFileName = "arcane_aura\\arcane_aura_particle.str", hatEffectPos = -1, hatEffectPosX = 0, isRenderBeforeCharacter = false, isIgnoreRiding = false, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true }, [HatEFID.HAT_EF_arcane_aura_B] = { resourceFileName = "arcane_aura\\arcane_aura.str", hatEffectPos = -2, hatEffectPosX = 0.2, isRenderBeforeCharacter = true, isIgnoreRiding = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true }, [HatEFID.HAT_EF_gluttony_aura_A] = { resourceFileName = "gluttony_aura\\gluttony_aura_particle.str", hatEffectPos = -1, hatEffectPosX = 0, isRenderBeforeCharacter = false, isIgnoreRiding = false, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true }, [HatEFID.HAT_EF_gluttony_aura_B] = { resourceFileName = "gluttony_aura\\gluttony_aura.str", hatEffectPos = -2, hatEffectPosX = 0.2, isRenderBeforeCharacter = true, isIgnoreRiding = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true } } 6. Add Script NPC: rathena\npc\custom\hateffect.txt (Use command @efc in game) - script HATEFFECT -1,{ OnHatEffect: if(getgmlevel()>= 80){ input .@number; if (.@number < 1) end; if (.@number >= 301) end; for(.@i = 1; .@i < 300; ++.@i) hateffect .@i,false; hateffect .@number,true; end; } OnInit: bindatcmd "efc",strnpcinfo(3)+"::OnHatEffect"; end; } 7. Add npc in rathena\npc\scripts_custom.conf npc: npc/custom/hateffect.txt 8. (OPTIONAL) Add Hateffect in item: Example: - Id: 2301 AegisName: Cotton_Shirt Name: Cotton Shirt Type: Armor Buy: 10 Weight: 100 Defense: 1 Locations: Armor: true ArmorLevel: 1 Refineable: true Script: | hateffect HAT_EF_arcane_aura_A,true; hateffect HAT_EF_arcane_aura_B,true; UnEquipScript: | hateffect HAT_EF_arcane_aura_A,false; hateffect HAT_EF_arcane_aura_B,false; Update: My project all Auras. (09/27/2023) - Pack Auras: My Project All Auras Too my project Ragnarok Online Pre-Renewal(Offline) and guide for easy update. - Data Folder + Server: Google Drive or MediaFire - Client RO: Google Drive or MediaFire Guide for start server and Play: 0. Dowloand Client RO and Update. 1. Download Data Folder + Server 2. Copy all files C:/MyServer/Client (In folder Ragnarok Onmline). 3. Run C:/MyServer/UwAmp/UwAmp.exe 4. Start Server C:/MyServer/rathena/runserver.exe Enjoy!!! Gluttony Aura: Arcane Aura: Credits: LCDTheOG Fros
    3 points
  6. Version 1.0.1

    107 downloads

    i recoded older rAthena Serv Monitor by DarkIrata in newer WPF -> Added Multithreading Server Start -> Added 1Click-Restart Server Button -> Added the WebServ -> Errorlogs are working and saving without crashes -> New design the open-src code -> https://github.com/AoShinRO/rAthena-ServMonitor-ByAoShinHo
    Free
    3 points
  7. Prueba cambiando (BaseLevel/2) por status_get_lv(src)
    2 points
  8. src/status.cpp search for: // Skill-related recovery (only when sit) there you can edit the source. ^-^
    2 points
  9. Hey there, fellow Ragnarok enthusiasts! Welcome to RO Artisan Hub, your cozy corner of creativity where we sprinkle a little bit of magic onto your Ragnarok Online server. Are you ready to give your players an eye-popping visual feast that'll have them coming back for more? You're in the right place! Here's a peek at the goodies we've got lined up for you: Custom Patcher Skins - Tired of the same old loading screens? Our patcher skins are like a breath of fresh air, offering a visual treat that'll get your players excited before they even step foot into your world. (CODE INCLUDED!) Interface Designs - Clunky menus are a thing of the past. We'll deck out your UI with a slick, user-friendly design that's not just pretty to look at but also a breeze to navigate. Logo & Branding - First impressions count, and a killer logo sets the stage for your server's identity. Let us craft a branding package that'll make your server the talk of the town (or, in this case, the world of Midgard). Promotional Graphics - Need to spread the word about your server's latest and greatest features? Our promotional graphics are perfect for catching eyes on social media, forums, and beyond. We're all about collaboration here at RO Artisan Hub, so we'll be with you every step of the way to ensure the final product isn't just good; it's exactly what you envisioned. Your satisfaction is our top priority, and we're not happy until you're over the moon with your new designs. So what are you waiting for? Let's get together and make your Ragnarok Online server the envy of them all. Drop us a message, and we'll start spinning those creative gears right away! Happy gaming, The RO Artisan Hub Team Discord Server: https://discord.gg/KpXFFwrE
    2 points
  10. I have multiple generator project, maybe u can try.
    2 points
  11. Here is another fully furbished Morroc Town! Join my Discord Channel: https://discord.gg/AhBjDJnEW3 Cinematic! morom.mp4
    2 points
  12. This is my new work Payon Town ROM! Join my Discord Channel: https://discord.gg/AhBjDJnEW3 Cinematic! payorm.mp4
    2 points
  13. Was having errors running my own 20220406 client, and this saved me. Thanks for this !
    2 points
  14. I'm developing a server based on a game called Harvest Moon. Conclude the Farm system, it will accept trees, vegetables and animals. What do you think? Any suggestions? Content of the video in Portuguese.
    2 points
  15. There are two methods for doing that: Once you have the current frame, click on: Then add the name of the file, like "test.wav". The file should be in data\wav\test.wav You can add a bunch of sound names by editing the list instead: Then select the sound for the frame from the list. If the sound doesn't play when testing the sprite, then it's just because it wasn't found in the resources. That's not really important, but you can add more resources from File > Settings > Sound:
    2 points
  16. Hello, I'm sharing this project, since this might help someone who need to generate this easily. The file that generated = CheckAttendance_EN.lub & attendance.yml Download, extract, add it in your System folder and server file or create a patch or anything. You can access to this simple project here : https://x-files.amirazman.my/attendance. Let me know if you having issues and Ill update it if possible & have some leisure time to play with.
    2 points
  17. Already answered your question in discord.
    2 points
  18. Hello, ive update this for weapon, robe and headgear generator, so when there is no script, its not generated at iteminfo. too. Let me know if you found any issue or anymore improvements/ideas to make this tools better. Ive been planning to add the SQL part too, but maybe later.
    2 points
  19. Version 1.0.1

    130 downloads

    ***Include Abyss Lake4**** -IllusionTeddy Bear/Labyrinth base on https://www.divine-pride.net/ (Include Drops Table) -No Portal -Issgard Dun/Frozen scale Field are custom to fit my server. (Custom Drops Table) Install : Put Mob and mob skill to rathena\db\import PutNpcfiles (Custom.txt) to rathena\npc\custom add new line npc: npc/custom/Custom.txt at rathena\npc\scripts_custom.conf
    Free
    2 points
  20. Version 1.0.0

    219 downloads

    Hello everyone! Happy New Year! Here are my handmade gifts, custom maps for you: 2024: 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/ 2023: 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/ 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 ~ 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
  21. https://github.com/rathena/rathena/blob/master/src/config/renewal.hpp#L45C1-L45C21 If you didnt want Renewal drop mode, then you can disable it.
    1 point
  22. 1) You add the numbers together that you want it enabled for. For example if you only want Heal and Sactuary to be boosted by this bonus, then you would put "3" (1+2). If you want everything to be affected from that list you put 1+2+4+8+16+32+64+128+256=511. 2) If you are running renewal, you can define the exp and drop penalty here: https://github.com/rathena/rathena/blob/master/db/re/level_penalty.yml
    1 point
  23. gunakan code box formating untuk code agar lebih rapih dan text formating code tidak berubah, script engine pada emulator sensitive untuk tab dan space pada saat parsing code. saya telah meninggalkan beberapa catatan pada script silahkan di telaah. prontera,158,180,4 script VRO Asisten 100,{ mes "[VRO Asisten]"; mes "Halo! Apakah kamu ingin menjual Jellopy padaku? Saya membayar harga yang berbeda tergantung waktu!"; next; // Tampilkan harga yang saat ini ditawarkan mes "Saat ini, saya akan membeli Jellopy seharga "+.selected_price+" Zeny per buah."; next; // Note 1: // Kalau bisa jangan terlalu banyak membuat nesting if else // buat script mudah di baca dan pahami dengan sekilas agar mudah dalam debuging. // Cek apakah pemain memiliki Jellopy if (countitem(909) < 1) { mes "Tampaknya kamu tidak memiliki Jellopy!"; close; } mes "Berapa banyak Jellopy yang ingin kamu jual?"; // Note 2: // gunakan variable type yg tepat // untuk user input seperti ini gunakan temporary script variable type ".@" // Note 3: // ".selected_price" dapat berubah ketika script dalam keadaan "suspended / pause" state // script command yg dapat menyebabkan suspended / pause state, // sleep, sleep2, next, progressbar, menu, select. // sebaiknya preserve value ".selected_price" pada saat user akses time dan bandingkan nanti // apakah value ".selected_price" berubah atau tidak (validasi). .@selected_price = .selected_price; input .@amount; // *Note 1, prevent nesting if else if (.@amount < 0 || .@amount > countitem(909)) { mes "Mohon masukkan jumlah yang valid!"; close; } // *Note 3 validasi value ".selected_price" if (.@selected_price != .selected_price) { mes "Harga telah berubah, silahkan coba lagi!"; close; } // Hitung total zeny yang akan diterima pemain // *Note 2, use apt variable type. .@total_price = .@amount * .selected_price; mes "Kamu akan mendapatkan "+ .@total_price +" Zeny untuk "+ .@amount +" Jellopy."; next; // *Note 3 validasi value ".selected_price" if (.@selected_price != .selected_price) { mes "Harga telah berubah, silahkan coba lagi!"; close; } .@s = select("Jual:Ya,Tidak"); if (.@s == 1) { // *Note 3 validasi value ".selected_price" if (.@selected_price != .selected_price) { mes "Harga telah berubah, silahkan coba lagi!"; close; } // Konfirmasi penjualan dan transaksi delitem 909, .@amount; // Hapus Jellopy dari inventory pemain Zeny += .@total_price; // Berikan Zeny kepada pemain mes "Terima kasih telah menjual Jellopy-mu!"; } else { mes "Mungkin lain waktu!"; } close; OnInit: // Inisialisasi setarray .price[0], 10, 20, 30; // Array harga yang mungkin OnTimer900000: // ubah harga setiap 15 menit. stopnpctimer(); // Menetapkan harga acak dari array .price set .selected_price, .price[rand(getarraysize(.price))]; // use initnpctimer() script command disini untuk membuat loop. initnpctimer(); end; }
    1 point
  24. Because of how Gitlab and Git-LFS works, I can only update the `data.grf` once. For subsequent updates, it’s more efficient to delete the entire repository and re-upload the folder. If I don’t follow this process, any modification to data.grf, even as small as 2 bytes, would result in an upload of nearly 12GB I'm currently uploading it
    1 point
  25. src/skill.cpp case NV_FIRSTAID: clif_skill_nodamage(src,bl,skill_id,5,1); status_heal(bl,5,0,0); <---- just change 5 to your wished amount break;
    1 point
  26. Let me know if you have any issue, suggestion or ideas for it. Glad it could help you out.
    1 point
  27. Updated: iRO 2024 OngoingQuestInfoList.lub Also Rachel and Veins board NPCs: rachel,87,73,0 script Bounty Board 80-100#rac1 2_BULLETIN_BOARD,{ callfunc "F_Bounty_Board", 80, 100, 20, 2, 1030, 63516, 697125, 697125, // ANACONDAQ 1782, 63517, 697125, 697125, // ROWEEN 1776, 63518, 697125, 697125; // SIROMA end; OnInit: questinfo(QTYPE_QUEST, QMARK_NONE, "BaseLevel >= 80 && BaseLevel <= 100"); end; } rachel,89,73,0 script Bounty Board 100-120#rac2 2_BULLETIN_BOARD,{ callfunc "F_Bounty_Board", 100, 120, 20, 2, 1106, 63519, 270000, 202500, // DESERT_WOLF 1781, 63520, 202500, 151950, // DROSERA 1629, 63521, 285000, 213750, // HILL_WIND 1777, 63522, 408600, 396600, // ICE_TITAN 1775, 63523, 408600, 396600; // SNOWIER end; OnInit: questinfo(QTYPE_QUEST, QMARK_NONE, "BaseLevel >= 100 && BaseLevel <= 120"); end; } rachel,91,73,0 script Bounty Board 120-140#rac3 2_BULLETIN_BOARD,{ callfunc "F_Bounty_Board", 120, 140, 20, 2, 1769, 63524, 589950, 442350, // AGAV 1770, 63525, 553500, 415200, // ECHIO 1773, 63526, 563700, 422700, // HODREMLIN 1772, 63527, 518400, 388800, // ISILLA 1774, 63528, 601200, 450900, // SEEKER 1771, 63529, 486000, 364500; // VANBERK end; OnInit: questinfo(QTYPE_QUEST, QMARK_NONE, "BaseLevel >= 120 && BaseLevel <= 140"); end; } veins,226,154,0 script Bounty Board 80-100#vei1 2_BULLETIN_BOARD,{ callfunc "F_Bounty_Board", 80, 100, 20, 2, 1784, 63530, 380400, 285450; // STAPO end; OnInit: questinfo(QTYPE_QUEST, QMARK_NONE, "BaseLevel >= 80 && BaseLevel <= 100"); end; } veins,224,154,0 script Bounty Board 100-120#vei2 2_BULLETIN_BOARD,{ callfunc "F_Bounty_Board", 100, 120, 20, 2, 1781, 63531, 270000, 202500, // DROSERA 1783, 63532, 265350, 199050, // GALION 1836, 63533, 380400, 285450, // MAGMARING 1780, 63534, 291600, 218700; // MUSCIPULAR end; OnInit: questinfo(QTYPE_QUEST, QMARK_NONE, "BaseLevel >= 100 && BaseLevel <= 120"); end; } veins,222,154,0 script Bounty Board 120-140#vei3 2_BULLETIN_BOARD,{ callfunc "F_Bounty_Board", 120, 140, 20, 2, 1833, 63535, 839700, 1156200, // KASA 1838, 63536, 553500, 565200, // KNOCKER 1831, 63539, 887700, 1070700, // SALAMANDER 1870, 63537, 837000, 627600, // NECROMANCER 1865, 63538, 527100, 462900, // RAGGED_ZOMBIE 1864, 63540, 590700, 405300; // ZOMBIE_SLAUGHTER end; OnInit: questinfo(QTYPE_QUEST, QMARK_NONE, "BaseLevel >= 120 && BaseLevel <= 140"); end; } And \db\import\quest_db.yml # iRO Bounty Board Rachel and Veins - Id: 63516 Title: Bounty Board Hunt Targets: - Mob: ANACONDAQ Count: 150 - Id: 63517 Title: Bounty Board Hunt Targets: - Mob: ROWEEN Count: 150 - Id: 63518 Title: Bounty Board Hunt Targets: - Mob: SIROMA Count: 150 - Id: 63519 Title: Bounty Board Hunt Targets: - Mob: DESERT_WOLF Count: 150 - Id: 63520 Title: Bounty Board Hunt Targets: - Mob: DROSERA Count: 150 - Id: 63521 Title: Bounty Board Hunt Targets: - Mob: HILL_WIND Count: 150 - Id: 63522 Title: Bounty Board Hunt Targets: - Mob: ICE_TITAN Count: 150 - Id: 63523 Title: Bounty Board Hunt Targets: - Mob: SNOWIER Count: 150 - Id: 63524 Title: Bounty Board Hunt Targets: - Mob: AGAV Count: 150 - Id: 63525 Title: Bounty Board Hunt Targets: - Mob: ECHIO Count: 150 - Id: 63526 Title: Bounty Board Hunt Targets: - Mob: HODREMLIN Count: 150 - Id: 63527 Title: Bounty Board Hunt Targets: - Mob: ISILLA Count: 150 - Id: 63528 Title: Bounty Board Hunt Targets: - Mob: SEEKER Count: 150 - Id: 63529 Title: Bounty Board Hunt Targets: - Mob: VANBERK Count: 150 - Id: 63530 Title: Bounty Board Hunt Targets: - Mob: STAPO Count: 150 - Id: 63531 Title: Bounty Board Hunt Targets: - Mob: DROSERA Count: 150 - Id: 63532 Title: Bounty Board Hunt Targets: - Mob: GALION Count: 150 - Id: 63533 Title: Bounty Board Hunt Targets: - Mob: MAGMARING Count: 150 - Id: 63534 Title: Bounty Board Hunt Targets: - Mob: MUSCIPULAR Count: 150 - Id: 63535 Title: Bounty Board Hunt Targets: - Mob: KASA Count: 150 - Id: 63536 Title: Bounty Board Hunt Targets: - Mob: KNOCKER Count: 150 - Id: 63537 Title: Bounty Board Hunt Targets: - Mob: NECROMANCER Count: 150 - Id: 63538 Title: Bounty Board Hunt Targets: - Mob: RAGGED_ZOMBIE Count: 150 - Id: 63539 Title: Bounty Board Hunt Targets: - Mob: SALAMANDER Count: 150 - Id: 63540 Title: Bounty Board Hunt Targets: - Mob: ZOMBIE_SLAUGHTER Count: 150
    1 point
  28. U can config the job master and add additional lines. Everything u need u will find on doc/script_commands.txt and the Jobchanger on npc/custom/jobmaster.txt by @Euphy Rynbef~
    1 point
  29. short description There are 3 different generations of laboratory monsters: 1. Egnigem, Wickebine, Laurell, Errende, Josephina, Kavach, Armeyer 2. Seyren, Eremes, Kathryne, Margaretha, Cecil, Howard 3. Randel, Gertie, Celia, Chen, Trentini, Alphoccio, Flamel I collect them, correct mistakes, add every possible class to each monster, recolor them in 3 official color sets and improve their aura. As a basis, I took the logic of the first implemented sprites at lhz_dun01-03 If you compare the following kRO sprites with corrections in the changelog you will notice that the logic has ceased to be respected and the sprites do not even have sounds! LINK TO FILE: https://mega.nz/file/tGFCxRSL#y5S8uLWw0cMCrLt059ycmZSeeFY1oLYTSVJwa0BoEWs [DONE] 1st class 2nd class advanced class 3rd class 3rd japan edition class 4th class latest expanded classes previous versions of some classes custom extended classes The total number of sprites in the pack: all classes from novice to 4th class (with different types of weapons) x 3 official color sets = 600 sprites changelog: (!) Below are the non-clean gifs recorded using GifCam.exe over the Act Editor (!) So these can brake or accelerate and do not serve as an accurate image. These gifs are added just for reference For clarity, the background of the laboratory is taken, and the sprites are shown in transparent blue 969F9EE7 and with improved aura Seyren Windsor Eremes Guile Kathryne Keyron Margaretha Sorin Cecil Damon Howard Alt-Eisen Randel Lawrence Gertie Wie Celia Alde Chen Lio Trentini Ilaria Alphoccio Basil Flamel Emure Egnigem Chenia Wickebine Tres Laurell Weinder Errende Ebecee Josephina Kavach Icarus Armeyer Dinze
    1 point
  30. you can use my old battleground scripts as reference. Most of them doesn't require waiting room limits
    1 point
  31. Hi, the new minimap option/feature is awesome, thank you for improving GRF Editor still.
    1 point
  32. You're absolutely right. I just started going through the various vilnerabilities in my latest guides. Thanks for pointing this out! I have updated the guide to include a quick method to disallow anyone but the host(s) to have access to PMA.
    1 point
  33. Just Init an NPC Timer that trigger a label. https://github.com/rathena/rathena/blob/26335994588c4b45846c05d0e53780ead78e475c/doc/script_commands.txt#L7169 Rynbef~
    1 point
  34. Hello. Using getunitdata inside a if statement is causing the error. Don't know why. Try: - script cashpoints -1,{ OnInit: setarray .champions$,"Elusive","Furious","Ringleader","Solid","Swift"; end; OnNPCKillEvent: .@exists = getunitdata(killedgid, .@data); if ( .@exists != -1 ){ .@mode = .@data[UMOB_MODE]; if(.@mode & MD_MVP){ if ( getmonsterinfo( killedrid, MOB_LV ) < 71 ) #CASHPOINTS += rand( 5, 10 ); else #CASHPOINTS += rand( 10, 15 ); //MVP } else if(.@mode & MD_STATUSIMMUNE){ if ( getmonsterinfo( killedrid, MOB_LV ) < 71 ) #CASHPOINTS += rand( 3, 8 ); else #CASHPOINTS += rand( 8, 13 ); //miniboss }else { for(.@i = 0; .@i < getarraysize(.champions$); .@i++){ if(compare(.@mobname$,.champions$[.@i])){ if ( getmonsterinfo( killedrid, MOB_LV ) < 71 ) #CASHPOINTS += rand( 1, 3 ); else #CASHPOINTS += rand( 3, 6 ); //cashpoints break; } } //Champion tests } } end; }
    1 point
  35. Honestly, mirroring the download link feels a bit pointless to me. The repo's getting updates overtime, and trying to keep up with mirroring every new version? Nah, not really my jam. I recommend redownloading it, as it appears your initial download may have been corrupted.
    1 point
  36. Hello, I'm sharing this project, since this might help someone who need to generate this easily. Right now, this project support custom file generator for : 1. Custom headgear. 2. Custom robe/garment. 3. Custom weapon. 4. Custom NPC. The required file generated depends on which generator that you used. The scenario on how to generate for custom headgear file : 1. Maybe extract data\texture\유저인터페이스\item\ folder and u will have the listed one .BMP that u want to add. 2. Select all the item u want to add, right click mouse and right click, copy as path. Then open notepad, paste it. 3. Get the only .BMP in list, so replace your directory path and replace all with blank/nothing . And lastly the " with blank/nothing. So the result is as below. Copy all of it, insert in https://x-files.amirazman.my/customfilegenerator and change your : - Starting ItemID you want it to start with. Make sure the itemID is supported by your client. - Starting AccessoryID that you didnt use yet. Also make sure the final accessoryID didnt reach the maximum of your client can support/set. - Defense, so you can set all the defense in bulk. - Weight. - Slots. - Script. Insert any scripts or anything that you can replace all easily later on in itemdb and also custom_iteminfo.lua (yes, its generated inside the description). - Item Type for now only support headgears and costume headgears, I will add another item types soon if possible (yes, its generated inside the description). And click Generate. Download, extract, add it in your System folder and server file or create a patch or anything. You can access to this simple project here : https://x-files.amirazman.my/customfilegenerator. Let me know if you having issues and I'll update it if possible & have some leisure time to play with.
    1 point
  37. If you're looking for something clientside there are various launchers with some serverside communication. For example rgzlauncher. You'd need to send a custom packet/message to the launcher which exists at the same time as the client and then run the application from that launcher. You could also just create your own launcher which does something similar.
    1 point
  38. Hello, no, but has been merged in https://x-files.amirazman.my/customfilegenerator. I hope you can access it there.
    1 point
  39. I see. I went with the first solution I came up with from the top of my head. But it isn't that hard to do it the way you are showing either. You simply can use an invisible npc with an OnTouchNPC label that teleports the mob back into the desired area. - script EXAMPLE_SPAWN -1,{ OnInit: areamonster("prontera", 151, 149, 155, 143, "", "poring", 2); } - script MOB_BOUNDARY_CELL -1,{ OnTouchNPC: unitwarp(getattachedrid(), "this", 153, 147); } prontera,150,150,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#01 -1,0,0 prontera,151,150,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#02 -1,0,0 prontera,152,150,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#03 -1,0,0 prontera,153,150,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#04 -1,0,0 prontera,154,150,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#05 -1,0,0 prontera,155,150,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#06 -1,0,0 prontera,156,150,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#07 -1,0,0 prontera,150,149,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#08 -1,0,0 prontera,150,148,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#09 -1,0,0 prontera,150,147,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#10 -1,0,0 prontera,150,146,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#11 -1,0,0 prontera,150,145,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#12 -1,0,0 prontera,150,144,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#13 -1,0,0 prontera,150,144,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#14 -1,0,0 prontera,151,144,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#15 -1,0,0 prontera,152,144,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#16 -1,0,0 prontera,153,144,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#17 -1,0,0 prontera,154,144,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#18 -1,0,0 prontera,155,144,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#19 -1,0,0 prontera,156,144,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#20 -1,0,0 prontera,156,149,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#21 -1,0,0 prontera,156,148,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#22 -1,0,0 prontera,156,147,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#23 -1,0,0 prontera,156,146,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#24 -1,0,0 prontera,156,145,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#25 -1,0,0 prontera,156,144,0 duplicate(MOB_BOUNDARY_CELL) MOB_BOUNDARY_CELL#26 -1,0,0
    1 point
  40. I was reading this topic yesterday and discovered that most of the requests were not added. Therefore, I am making my debut here to share with you the updated @autoattack function. Added Commands: @autoattack - display all @autoattack commands. @autoattack on/off @autoattack list @autoattack +monsterID @autoattack -monsterID #Edit If you use [ @autoattack on ] without adding monster targets will attack all the monsters (DEFAULT setting.) Auto-attack can be toggled on or off using the @autoattack on/off command. Specific mobs can be added or removed from the target list using @autoattack +<mobID> or @autoattack -<mobID> respectively. Since I'm using the latest version, applying the patch shouldn't be a problem.(I also removed the struct warnings from the map_session_data). Attached(Updated): atcommand[remix]
    1 point
  41. Many ask me for support, although there is a guide here from another member on the forum., for some reason this guide, besides being outdated, has files that don't exist (iteminfo.lub with another name) and it confuses a lot of people Quick guide to hands-on teaching you how to install garment on your rAthena emulator and Client-side Note: The garments are not considerable common looks, so they do not use Accessoryid.lub and accname.lub. Features we’re going to use: • iteminfo.lua • SpriteRobeId.lub • SpriteRobeName.lub • item_db_equip.yml • 1 image Collection • 1 bmp image for inventory • 1 spr and act of item when dragged • 1 spr and act of the equipment (male or female) STEP 1 First let’s add the name we want to the client-side System/iteminfo.lub Orange = Item id Green = collection/act/spr file name Blue = Title name Purple = item description [250001] = { unidentifiedDisplayName = "Unidentified Garment", unidentifiedResourceName = "후드", unidentifiedDescriptionName = { "Can be identified by using a ^990099Magnifier^000000." }, identifiedDisplayName = "Super Angel Wing", identifiedResourceName = "Angel_wing", identifiedDescriptionName = { "White wings of a holy Archangel.", "____________", "^0000CCType:^000000 Garment", "^0000CCDefense:^000000 18", "^0000CCWeight:^000000 20", "____________", "^0000CCRequirement:^000000 None" }, slotCount = 1, ClassNum = 1, costume = false }, • In the print it will look like this: Now I’m going to right click on any item or id and select the option COPY TO… Obs: the ideal is you already get the id of some wing, for example the ArchAngel which is the 2573 as we are going to make a wing, it can be the same as it. (if I were to make a sword for example or something related in the back, it could be Thanatos Sword as an example) and you put the new id, in the case of the example it is the 250001 If you notice the Archangel Wings VIEWID is the 1: So let’s put the ID of our custom, which is 84, the ID we chose in the file SpriteRobeID.lub Staying like this in the Server data base: In YML it looked like this, after saving: Now the bureaucratic part is definitely over, let’s just copy the files to the data folder and connect. STEP 3 Let’s go to the files now, the paths we’re going to use is: inventory= data\texture\À¯ÀúÀÎÅÍÆäÀ̽º\item\ Collection = data\texture\À¯ÀúÀÎÅÍÆäÀ̽º\collection\ drag inventory = data\sprite\¾ÆÀÌÅÛ\ wing (Male) = data\sprite\·Îºê\Angel_Wing\³²\ wing (Female) = data\sprite\·Îºê\Angel_Wing\¿©\ Note: Currently the client only reads the file by the name of the class, I’m going to use the LEARN (novice) class in the example, but ideally you use a garment generator and generate the same file for all classes (I think this one can be a good gerator *I haven’t tested it yet* But let’s test only with 1 class to test, as I said, I’ll use the apprentice, the sprite name is: Ãʺ¸ÀÚ_³² first let’s paste the textures, Collection folder in place data\texture\À¯ÀúÀÎÅÍÆäÀ̽º\collection\ folder item inventory = data\texture\À¯ÀúÀÎÅÍÆäÀ̽º\item\ Now we can go to the Sprites, Drop inventory = data\sprite\¾ÆÀÌÅÛ\ wing (male) = data\sprite\·Îºê\Angel_Wing\³²\ Note that the filename goes one folder before, and in the file goes the class name, this can be repeated for the female folder. in-game looked like this on @item 250001 with the class @job 0 Some observations: 1 – I had to change the SDE from (4) to 8192 to test if the robe custom was right, so that’s why it’s in the look tab and not the Equip tab, but I saw that it doesn’t make a difference, so disregard it. 2 – If the Wing appears on the ALT+Q but does not appear on the character as in this image below you probably don’t have the id in transparentitem.lub is an extra file that controls the transparency of the item, this file’s default for non-existent ids is 0 (transparent) so you just open it and so here: 84 = is ID { 84, 255, 255, 0 },
    1 point
  42. Version 4.1

    2219 downloads

    A NPC that allow your Characters to Switch Build from time to time. Players are able to save his current status build , so that he/she can switch back to the saved build whenever he/she want. Players no need to keep memorize their status build upon changed. Configuration : // maximum build player can store (0 = disable) .max_build = 3; // check player weight limit before switching stat (0 = disable) .check_weight_limit = 1;
    Free
    1 point
  43. This is a simple site that allows you to create your own RO Login Background. Although it is not yet 100% complete at the time of writing, it is fully functional and only lacks froggy aesthetic design. With this tool, you can upload any image of your choice and select the desired area to be cropped. You can also adjust the aspect ratio to your liking. The default output is a 24bit BMP, which produces very good quality images, you can choose to get the BMPs as 8Bit version if you check the checkbox, which will reduce the final output size (and quality too). Tool URL: FroggoCutter (sapitosucio.github.io) The files generated have the following format: t_¹è°æX-Y.bmp, said files are compressed into a .zip file, then it's downloaded. Do remember those BMPs files should be placed on: data\texture\À¯ÀúÀÎÅÍÆäÀ̽º Btw everything is done locally, nothing is uploaded. You can see it's source code here Known Issues: When you try to slice a big image (>3000px) and 8Bit is selected, the browser may lock itself for a few seconds (❁´◡`❁) Froggo tip of the day: Use big images(>2000px), upscale them or something and then, slice it, the final result is quite gucci ? Some SS:
    1 point
  44. If you've gotten annoyed with the limitation of not being able to see what homunculus is inside the Embryo, I've coded a significantly more complicated version of this change that displays a pet incubator-like dialog and lets you pick the embryo you want to hatch. This is much more complex from a coding perspective though, so you should make sure you're confident in making changes to the codebase. Any embryos made with the old version of the mod will still work, but you'll have to hatch and rest them to convert them to their named versions. This will also require you to distribute a new version of iteminfo.lub. First, you need to add a new method to clif.hpp: void clif_sendembryo(struct map_session_data* sd); Next, you need to add the code for this method to clif.cpp: /// Presents a list of embyros that can be revived /// 01a6 <packet len>.W { <index>.W }* void clif_sendembryo(struct map_session_data* sd) { int i, n = 0, fd; nullpo_retv(sd); fd = sd->fd; WFIFOHEAD(fd, MAX_INVENTORY * 2 + 4); WFIFOW(fd, 0) = 0x1a6; for (i = 0, n = 0; i < MAX_INVENTORY; i++) { if (sd->inventory.u.items_inventory[i].nameid <= 0 || sd->inventory_data[i] == NULL || (sd->inventory_data[i]->nameid != 7142 && !(sd->inventory_data[i]->nameid >= 9901 && sd->inventory_data[i]->nameid <= 9909)) || sd->inventory.u.items_inventory[i].amount <= 0) continue; WFIFOW(fd, n * 2 + 4) = i + 2; n++; } WFIFOW(fd, 2) = 4 + n * 2; WFIFOSET(fd, WFIFOW(fd, 2)); sd->menuskill_id = AM_CALLHOMUN; sd->menuskill_val = -1; } There's also a change needed in clif.cpp: Find the method clif_parse_SelectEgg and replace it with this: /// Answer to pet incubator egg selection dialog (CZ_SELECT_PETEGG). /// 01a7 <index>.W void clif_parse_SelectEgg(int fd, struct map_session_data* sd) { if (sd->menuskill_val != -1) return; if (sd->menuskill_id == SA_TAMINGMONSTER) { pet_select_egg(sd, RFIFOW(fd, packet_db[RFIFOW(fd, 0)].pos[0]) - 2); clif_menuskill_clear(sd); } if (sd->menuskill_id == AM_CALLHOMUN) { hom_call(sd, RFIFOW(fd, packet_db[RFIFOW(fd, 0)].pos[0]) - 2); if (sd->pd) clif_send_petstatus(sd); // the client wipes the pet status upon answering this dialog, so it has to be resent. clif_menuskill_clear(sd); } } Now we need to change homunculus.hpp. Find the definition for hom_call and change it to this: bool hom_call(struct map_session_data *sd, short hom_index); Now in homunculus.cpp: Replace the hom_call method with this: /** * Make a player spawn a homonculus (call) * @param sd * @param hom_index * @return False:failure, True:sucess */ bool hom_call(struct map_session_data* sd, short hom_index) { struct homun_data* hd; struct item ed; int n; if (hom_index < 0 || hom_index >= MAX_INVENTORY) return 0; //Forged packet! // find the embryo if (!sd->status.hom_id) { //Create or revive a homun. if (sd->inventory.u.items_inventory[hom_index].nameid == 7142 || sd->inventory.u.items_inventory[hom_index].nameid >= 9901 && sd->inventory.u.items_inventory[hom_index].nameid <= 9909) n = hom_index; else { ShowError("wrong embryo item inventory %d\n", hom_index); return false; } ed = sd->inventory.u.items_inventory[n]; if (ed.card[1] != 0) { // is it ours? if (sd->status.char_id == MakeDWord(ed.card[2], ed.card[3])) { // revive the homun // delete the embryo pc_delitem(sd, n, 1, 0, 0, LOG_TYPE_CONSUME); sd->status.hom_id = ed.card[1]; // proceed with rest of function } else { // Cannot revive someone else's homunculus return false; } } else { // create a new homun // delete the embryo pc_delitem(sd, n, 1, 0, 0, LOG_TYPE_CONSUME); return hom_create_request(sd, HM_CLASS_BASE + rnd_value(0, 7)); } } // If homunc not yet loaded, load it if (!sd->hd) return intif_homunculus_requestload(sd->status.account_id, sd->status.hom_id); hd = sd->hd; if (!hd->homunculus.vaporize) return false; //Can't use this if homun wasn't vaporized. if (hd->homunculus.vaporize == HOM_ST_MORPH) return false; // Can't call homunculus (morph state). hom_init_timers(hd); hd->homunculus.vaporize = HOM_ST_ACTIVE; if (hd->bl.prev == NULL) { //Spawn him hd->bl.x = sd->bl.x; hd->bl.y = sd->bl.y; hd->bl.m = sd->bl.m; if(map_addblock(&hd->bl)) return false; clif_spawn(&hd->bl); clif_send_homdata(sd,SP_ACK,0); clif_hominfo(sd,hd,1); clif_hominfo(sd,hd,0); // send this x2. dunno why, but kRO does that [blackhole89] clif_homskillinfoblock(sd); if (battle_config.hom_setting&HOMSET_COPY_SPEED) status_calc_bl(&hd->bl, SCB_SPEED); hom_save(hd); } else //Warp him to master. unit_warp(&hd->bl,sd->bl.m, sd->bl.x, sd->bl.y,CLR_OUTSIGHT); return true; } Also replace the hom_vaporize method with this: /** * Vaporize a character's homunculus * @param sd * @param flag 1: then HP needs to be 80% or above. 2: then set to morph state. */ int hom_vaporize(struct map_session_data *sd, int flag) { struct homun_data *hd; int itemflag; struct item tmp_item; nullpo_ret(sd); hd = sd->hd; if (!hd || hd->homunculus.vaporize) return 0; if (status_isdead(&hd->bl)) return 0; //Can't vaporize a dead homun. if (flag == HOM_ST_REST && get_percentage(hd->battle_status.hp, hd->battle_status.max_hp) < 80) return 0; hd->regen.state.block = 3; //Block regen while vaporized. //Delete timers when vaporized. hom_hungry_timer_delete(hd); //hd->homunculus.vaporize = flag ? flag : HOM_ST_REST; if (battle_config.hom_setting&HOMSET_RESET_REUSESKILL_VAPORIZED) memset(hd->blockskill, 0, sizeof(hd->blockskill)); clif_hominfo(sd, sd->hd, 0); hom_save(hd); if (hd->homunculus.intimacy > 0) { memset(&tmp_item, 0, sizeof(tmp_item)); switch (hom_class2mapid(hd->homunculus.class_)) { case MAPID_LIF: case MAPID_LIF_E: tmp_item.nameid = 9901; break; case MAPID_AMISTR: case MAPID_AMISTR_E: tmp_item.nameid = 9902; break; case MAPID_FILIR: case MAPID_FILIR_E: tmp_item.nameid = 9903; break; case MAPID_VANILMIRTH: case MAPID_VANILMIRTH_E: tmp_item.nameid = 9904; break; case MAPID_EIRA: tmp_item.nameid = 9905; break; case MAPID_BAYERI: tmp_item.nameid = 9906; break; case MAPID_SERA: tmp_item.nameid = 9907; break; case MAPID_DIETER: tmp_item.nameid = 9908; break; case MAPID_ELANOR: tmp_item.nameid = 9909; break; } tmp_item.amount = 1; tmp_item.identify = 1; tmp_item.card[0] = CARD0_CREATE; tmp_item.card[1] = hd->homunculus.hom_id; tmp_item.card[2] = GetWord(sd->status.char_id, 0); // CharId tmp_item.card[3] = GetWord(sd->status.char_id, 1); if ((itemflag = pc_additem(sd, &tmp_item, tmp_item.amount, LOG_TYPE_PRODUCE))) { clif_additem(sd, 0, 0, itemflag); if (battle_config.skill_drop_items_full) { map_addflooritem(&tmp_item, tmp_item.amount, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0, 0); } } unit_remove_map(&hd->bl, CLR_OUTSIGHT); sd->status.hom_id = 0; unit_free(&hd->bl, CLR_OUTSIGHT); sd->hd = 0; return 1; } return unit_remove_map(&hd->bl, CLR_OUTSIGHT); } Getting there, we now need to make a couple changes to skill.cpp: As with the first version of this process, comment out this line: (If you already implemented the first version this will be done already) if (sd->status.hom_id) //Don't delete items when hom is already out. Now find this code block: case AM_CALLHOMUN: //[orn] if (sd && !hom_call(sd)) clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); break; And replace it with this: case AM_CALLHOMUN: if (sd && !sd->status.hom_id) { clif_sendembryo(sd); clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); } else if (sd && !hom_call(sd, 0)) { clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); } break; Now, find this line in script.cpp: hom_call(sd); // Respawn homunculus. and replace it with this: hom_call(sd, 0); // Respawn homunculus. Phew! Done with code changes! Now we just need to add the new embryos into the item-db (for a fun challenge, see if you can determine what their item ids are from the code before we proceed further). If you have the old, text based item-db, you need to add this: 9901,Lif_Embryo,Lif Embryo,3,10,,10,,,,,,,,,,,,,{},{},{} 9902,Amistr_Embryo,Amistr Embryo,3,10,,10,,,,,,,,,,,,,{},{},{} 9903,Filir_Embryo,Filir Embryo,3,10,,10,,,,,,,,,,,,,{},{},{} 9904,Vanilmirth_Embryo,Vanilmirth Embryo,3,10,,10,,,,,,,,,,,,,{},{},{} 9905,Eira_Embryo,Eira Embryo,3,10,,10,,,,,,,,,,,,,{},{},{} 9906,Bayeri_Embryo,Bayeri Embryo,3,10,,10,,,,,,,,,,,,,{},{},{} 9907,Sera_Embryo,Sera Embryo,3,10,,10,,,,,,,,,,,,,{},{},{} 9908,Dieter_Embryo,Dieter Embryo,3,10,,10,,,,,,,,,,,,,{},{},{} 9909,Eleanor_Embryo,Eleanor Embryo,3,10,,10,,,,,,,,,,,,,{},{},{} If you have the new, yaml-based item-db, you need to add this to item-db-etc.yml - Id: 9901 AegisName: Lif_Embryo Name: Lif Embryo Type: Etc Buy: 10 Weight: 10 - Id: 9902 AegisName: Amistr_Embryo Name: Amistr Embryo Type: Etc Buy: 10 Weight: 10 - Id: 9903 AegisName: Filir_Embryo Name: Filir Embryo Type: Etc Buy: 10 Weight: 10 - Id: 9904 AegisName: Vanilmirth_Embryo Name: Vanilmirth Embryo Type: Etc Buy: 10 Weight: 10 - Id: 9905 AegisName: Eira_Embryo Name: Eira Embryo Type: Etc Buy: 10 Weight: 10 - Id: 9906 AegisName: Bayeri_Embryo Name: Bayeri Embryo Type: Etc Buy: 10 Weight: 10 - Id: 9907 AegisName: Sera_Embryo Name: Sera Embryo Type: Etc Buy: 10 Weight: 10 - Id: 9908 AegisName: Dieter_Embryo Name: Dieter Embryo Type: Etc Buy: 10 Weight: 10 - Id: 9909 AegisName: Eleanor_Embryo Name: Eleanor Embryo Type: Etc Buy: 10 Weight: 10 Finally, we just need to add the following to iteminfo.lub: [9901] = { unidentifiedDisplayName = "Lif Embryo", unidentifiedResourceName = "¿¥ºê¸®¿À", unidentifiedDescriptionName = { "..." }, identifiedDisplayName = "Lif Embryo", identifiedResourceName = "¿¥ºê¸®¿À", identifiedDescriptionName = { "An embryo containing a Lif.", "^FFFFFF_^000000", "Weight:^009900 1^000000" }, slotCount = 0, ClassNum = 0 }, [9902] = { unidentifiedDisplayName = "Amistr Embryo", unidentifiedResourceName = "¿¥ºê¸®¿À", unidentifiedDescriptionName = { "..." }, identifiedDisplayName = "Amistr Embryo", identifiedResourceName = "¿¥ºê¸®¿À", identifiedDescriptionName = { "An embryo containing an Amistr.", "^FFFFFF_^000000", "Weight:^009900 1^000000" }, slotCount = 0, ClassNum = 0 }, [9903] = { unidentifiedDisplayName = "Filir Embryo", unidentifiedResourceName = "¿¥ºê¸®¿À", unidentifiedDescriptionName = { "..." }, identifiedDisplayName = "Filir Embryo", identifiedResourceName = "¿¥ºê¸®¿À", identifiedDescriptionName = { "An embryo containing a Filir.", "^FFFFFF_^000000", "Weight:^009900 1^000000" }, slotCount = 0, ClassNum = 0 }, [9904] = { unidentifiedDisplayName = "Vanilmirth Embryo", unidentifiedResourceName = "¿¥ºê¸®¿À", unidentifiedDescriptionName = { "..." }, identifiedDisplayName = "Vanilmirth Embryo", identifiedResourceName = "¿¥ºê¸®¿À", identifiedDescriptionName = { "An embryo containing a Vanilmirth.", "^FFFFFF_^000000", "Weight:^009900 1^000000" }, slotCount = 0, ClassNum = 0 }, [9905] = { unidentifiedDisplayName = "Eira Embryo", unidentifiedResourceName = "¿¥ºê¸®¿À", unidentifiedDescriptionName = { "..." }, identifiedDisplayName = "Eira Embryo", identifiedResourceName = "¿¥ºê¸®¿À", identifiedDescriptionName = { "An embryo containing an Eira.", "^FFFFFF_^000000", "Weight:^009900 1^000000" }, slotCount = 0, ClassNum = 0 }, [9906] = { unidentifiedDisplayName = "Bayeri Embryo", unidentifiedResourceName = "¿¥ºê¸®¿À", unidentifiedDescriptionName = { "..." }, identifiedDisplayName = "Bayeri Embryo", identifiedResourceName = "¿¥ºê¸®¿À", identifiedDescriptionName = { "An embryo containing a Bayeri.", "^FFFFFF_^000000", "Weight:^009900 1^000000" }, slotCount = 0, ClassNum = 0 }, [9907] = { unidentifiedDisplayName = "Sera Embryo", unidentifiedResourceName = "¿¥ºê¸®¿À", unidentifiedDescriptionName = { "..." }, identifiedDisplayName = "Sera Embryo", identifiedResourceName = "¿¥ºê¸®¿À", identifiedDescriptionName = { "An embryo containing a Sera.", "^FFFFFF_^000000", "Weight:^009900 1^000000" }, slotCount = 0, ClassNum = 0 }, [9908] = { unidentifiedDisplayName = "Dieter Embryo", unidentifiedResourceName = "¿¥ºê¸®¿À", unidentifiedDescriptionName = { "..." }, identifiedDisplayName = "Dieter Embryo", identifiedResourceName = "¿¥ºê¸®¿À", identifiedDescriptionName = { "An embryo containing a Dieter.", "^FFFFFF_^000000", "Weight:^009900 1^000000" }, slotCount = 0, ClassNum = 0 }, [9909] = { unidentifiedDisplayName = "Eleanor Embryo", unidentifiedResourceName = "¿¥ºê¸®¿À", unidentifiedDescriptionName = { "..." }, identifiedDisplayName = "Eleanor Embryo", identifiedResourceName = "¿¥ºê¸®¿À", identifiedDescriptionName = { "An embryo containing an Eleanor.", "^FFFFFF_^000000", "Weight:^009900 1^000000" }, slotCount = 0, ClassNum = 0 }, And that should be everything! Now just recompile the codebase and restart the server and you should have the new homunculus behaviour. Hopefully I didn't miss anything in the steps.
    1 point
  45. For a while I hear "the ragnarok client can't do anything, it's very limited", so I decided to focus 1 year on learning reverse engineering, learning to read the code and invent my own ways, I learned methods to find the shapes and colors, and every day I was perfecting myself, today I can modify basically anything, when I can't, I set a goal to try a little more, here is my showcase and I hope you like it. when I started it was 2021, so 20200401 was my focus. Today I'm already upgrading to 20211117+ Change GM/Player/Mob/npc color? yes! very small npc box? yes I increased (I like space) MENU? YES! AP BAR for all jobs? YES! NEW WARP? yes! CUSTOM BASIC INFO? oh yes!! Custom LoadingBar? Yes! recover the old menu? yes Others mods: New Collection Night mode: Chat: Hp bar colors: others colors Text effects: Select Service Login Screen new position. Updates: I created a diff nemo that allows me to change the style, color, and direction. Original portal My custom
    1 point
  46. I just want to say thank you for making this tool, I've been a big fan of your works for a while. I'm a sprite artist and I've been dying to find out a way to make special effects, this makes it MUCH easier. I'm downloading it right now as I type this.
    1 point
  47. This is the easiest way to reload npc only once a command. Type @reloadnpc Enter an accurate directory location of npc without npc/ and without .txt and click OK example: custom/jobmaster wait 2 seconds and NPC successfully reloading NOTE: Make sure this script npc is already installed on athena_script.conf Only GM with level 99 can use @reloadnpc If this script help you, please help me to upvote and rate 5 stars this topic.
    1 point
  48. Hello there @Questune09, >>>>> step 1: after finshing the quest, under getitem ( the prize ) add this : set CooldownQuest,gettimetick(2); step 2: and before taking the quest add time check: if(gettimetick(2) - CooldownQuest < (60 * 60 * 24)) { next; mes "[ Daily Quest ]"; mes "^FF0000Sorry you have to wait 24 Hours until you can do the Quest again!^000000"; close; } <<<<< or use this prt_in,82,93,2 script Daily Quest 513,{ if (getgmlevel() >= 80) goto GM_Menu; L_START: if (getgmlevel() >= 80) next; mes "[ Daily Quest ]"; mes "Total Daily Quests Finished: ^008800"+$DailyQuestTotal+"^000000."; mes "Today Daily Quests Finished: ^0000FF"+$DailyQuestToday+"^000000."; next; mes "[Daily Quest]"; mes "Hello "+strcharinfo(0)+"!"; mes "Do you want to start today's Quest?"; mes " "; menu "Yes!",-,"Nahh",L_Close; if(gettimetick(2) - CooldownQuest < (60 * 60 * 24)) { next; mes "[ Daily Quest ]"; mes "^FF0000Sorry you have to wait 24 Hours until you can do the Quest again!^000000"; close; } next; mes "[Daily Quest]"; mes "You'll need these item for Today's Quest:"; mes "^FF0000"+getitemname($QuestItem1)+"^000000 x "+$QuestItem1HM+""; mes "^FF0000"+getitemname($QuestItem2)+"^000000 x "+$QuestItem2HM+""; mes "^FF0000"+getitemname($QuestItem3)+"^000000 x "+$QuestItem3HM+""; mes "In exchange you will get ^0000FF"+getitemname($DailyQuestPrize)+"^000000 x "+$DailyQuestPrizeHM+""; next; mes "[Daily Quest]"; mes "Do you have the items?"; menu "Yes! I do.",-,"Gimme some time.",L_Close; if(countitem($QuestItem1) >= $QuestItem1HM) && (countitem($QuestItem2) >= $QuestItem2HM) && (countitem($QuestItem3) >= $QuestItem3HM) goto FinishQuest; next; mes "[Daily Quest]"; mes "You only have "+countitem($QuestItem1HM)+" of ^FF0000"+getitemname($QuestItem1)+"^000000, "+countitem($QuestItem2HM)+" of ^FF0000"+getitemname($QuestItem2)+"^000000, "+countitem($QuestItem3HM)+" of ^FF0000"+getitemname($QuestItem3)+"^000000."; mes "Come back when you have it! Better get the items quickly. It's gonna change in a Day!"; close; L_Close: next; mes "[Daily Quest]"; mes "Come back again! Get the Items!"; mes "Goodbye!"; close; GM_Menu: mes "[Daily Quest]"; mes "Hello GM "+strcharinfo(0)+"!"; mes "What can I do for you today?"; menu "Player Menu",L_START,"Change Today's Quest/Prize",L_ChangeQuest,"Close",L_Close; L_ChangeQuest: next; mes "[Daily Quest]"; mes "What will you like to change?"; next; menu "Go back.",GM_Menu,"Prize [^0000FF"+getitemname($DailyQuestPrize)+"^000000 x "+$DailyQuestPrizeHM+"]",L_ChangePrize,"Change Quest Randomly",L_ChangeQuestRandom,"Change Quest by Myself",L_ChangeQuestMyself; L_ChangeQuestMyself: next; mes "[Daily Quest]"; mes "Which item would you like to change first?"; menu "Go Back.",L_ChangeQuest,"Item 1 [^FF0000"+getitemname($QuestItem1)+"^000000 x "+$QuestItem1HM+"]",L_ChangeItem1,"Item 2 [^FF0000"+getitemname($QuestItem2)+"^000000 x "+$QuestItem2HM+"]",L_ChangeItem2,"Item 3 [^FF0000"+getitemname($QuestItem3)+"^000000 x "+$QuestItem3HM+"]",L_ChangeItem3; L_ChangeItem1: next; mes "[Daily Quest]"; mes "Alright. What will be the item?"; next; input $QuestItem1; next; L_ChangeItem12: mes "[Daily Quest]"; mes "How much of ^ff0000"+getitemname($QuestItem1)+"^000000 do you want?"; mes "It must be in the range of ^0088001 ~ 200^000000."; next; input $QuestItem1HM; next; if ($QuestItem1HM > 200) goto L_HMItem1Denied; mes "[Daily Quest]"; mes "Item 1 Set."; set $DailyQuestToday,0; mes "^FF0000"+getitemname($QuestItem1)+"^000000 x "+$QuestItem1HM+"."; next; goto L_ChangeQuest; L_HMItem1Denied: mes "[Daily Quest]"; mes "This item (^ff0000"+getitemname($QuestItem1)+"^000000) must be in a range of ^0088001 ~ 200^000000."; next; goto L_ChangeItem12; L_ChangeItem2: next; mes "[Daily Quest]"; mes "Alright. What will be the item?"; next; input $QuestItem2; next; L_ChangeItem22: mes "[Daily Quest]"; mes "How much of ^ff0000"+getitemname($QuestItem2)+"^000000 do you want?"; mes "It must be in the range of ^0088001 ~ 150^000000."; next; input $QuestItem2HM; next; if ($QuestItem2HM > 150) goto L_HMItem2Denied; mes "[Daily Quest]"; mes "Item 2 Set."; set $DailyQuestToday,0; mes "^FF0000"+getitemname($QuestItem2)+"^000000 x "+$QuestItem2HM+"."; next; goto L_ChangeQuest; L_HMItem2Denied: mes "[Daily Quest]"; mes "This item (^ff0000"+getitemname($QuestItem2)+"^000000) must be in a range of ^0088001 ~ 150^000000."; next; goto L_ChangeItem22; L_ChangeItem3: next; mes "[Daily Quest]"; mes "Alright. What will be the item?"; next; input $QuestItem3; next; L_ChangeItem32: mes "[Daily Quest]"; mes "How much of ^ff0000"+getitemname($QuestItem3)+"^000000 do you want?"; mes "It must be in the range of ^0088001 ~ 50^000000."; next; input $QuestItem3HM; next; if ($QuestItem3HM > 50) goto L_HMItem3Denied; mes "[Daily Quest]"; mes "Item 3 Set."; set $DailyQuestToday,0; mes "^FF0000"+getitemname($QuestItem3)+"^000000 x "+$QuestItem3HM+"."; next; goto L_ChangeQuest; L_HMItem3Denied: mes "[Daily Quest]"; mes "This item (^ff0000"+getitemname($QuestItem3)+"^000000) must be in a range of ^0088001 ~ 50^000000."; next; goto L_ChangeItem32; L_ChangeQuestRandom: set $QuestItem1, rand(701,1065); set $QuestItem1HM, rand(1,200); set $QuestItem2, rand(701,1065); set $QuestItem2HM, rand(1,150); set $QuestItem3, rand(701,1065); set $QuestItem3HM, rand(1,50); set $DailyQuestToday,0; mes "[Daily Quest]"; mes "This is the Daily Quest:"; mes "^FF0000"+getitemname($QuestItem1)+"^000000 x "+$QuestItem1HM+""; mes "^FF0000"+getitemname($QuestItem2)+"^000000 x "+$QuestItem2HM+""; mes "^FF0000"+getitemname($QuestItem3)+"^000000 x "+$QuestItem3HM+""; next; goto GM_Menu; L_ChangePrize: next; mes "[Daily Quest]"; mes "Input the Prize"; next; input $DailyQuestPrize; next; mes "[Daily Quest]"; mes "The Prize: "+getitemname($DailyQuestPrize)+" x How many?"; next; input $DailyQuestPrizeHM; next; mes "[Daily Quest]"; mes "This is what you like?"; mes "^0000ff"+getitemname($DailyQuestPrize)+"^000000 x "+$DailyQuestPrizeHM+"."; menu "Yup, Thanks.",GM_Menu,"Noo! I made a mistake!",L_ChangePrize; FinishQuest: next; mes "[Daily Quest]"; mes "You got ^0000FF"+getitemname($DailyQuestPrize)+"^000000 x "+$DailyQuestPrizeHM+"."; delitem $QuestItem1,$QuestItem1HM; delitem $QuestItem2,$QuestItem2HM; delitem $QuestItem3,$QuestItem3HM; getitem $DailyQuestPrize,$DailyQuestPrizeHM; set CooldownQuest,gettimetick(2); set $DailyQuestTotal,$DailyQuestTotal +1; set $DailyQuestToday,$DailyQuestToday +1; close; } - script DailyQuestItemChanger -1,{ OnInit: OnClock0000: while ( getitemname( set( $QuestItem1, rand(701,1065) ) ) == "null" ); set $QuestItem1HM, rand(1,200); while ( getitemname( set( $QuestItem2, rand(701,1065) ) ) == "null" ); set $QuestItem2HM, rand(1,150); while ( getitemname( set( $QuestItem3, rand(701,1065) ) ) == "null" ); set $QuestItem3HM, rand(1,50); set $DailyQuestToday,0; end; } i recommend do adding the codes manually
    1 point
×
×
  • Create New...