Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation since 03/25/24 in Posts

  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.87GB to 2.15GB. official_data.grf took the same treatment and the file size went down to 426MB. Additionally, I have added a mini-map to all those maps that were lacking one, approximately 275 mini-maps were added, I only ignored some indoor (_in) and guild castles maps. Before BGM, the Rö folder has a total size of 2.62GB, after BGM it reaches 2.96GB 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.
    8 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. Hmm, there is an approximation that can be done which will probably be good enough. The point 2 is misleading; what is seen in the UI is a blend of the background + layers. You can't separate them as it's already a final image, if that makes sense. But you could in theory extract a transparency value by using a black and white background version of the composite image. Then do some math magic and approximate the bgra values. I've added the option in 1.1.0, though it's a bit awkward to use (found in File > Export as PNG...).
    3 points
  4. 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
  5. A new large map for group events with many players. This map contains three parts of Fortress Saint Darmain and Beacon Island with Pharos Lighthouse. It is also surrounded by parts of neighboring locations for ambience. And the main innovation is that you can enter all houses and caves without switching to another map. The map size is 450x450 tiles or 900x900 cells. .•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•. st_darmain Video: Since the four main maps cmd_fild06(07,08,09) were united by one theme, they were ideal for connection. They represent four different zones - jungle, desert, island, mountain ranges. And in the mountains there are a lot of obstacles in the form of fort ruins. The map is suitable for group events such as Battle Royale and etc. In the south and east of the map there are houses and caves available for visiting. The lighthouse rooms were designed by me, the rest of the rooms were taken from the maps in_rogue, job3_guil01(02), que_job01, alb_ship, and anthell01(02). Here you can place loot or simply hide from other players. In the second half of the video you can see a visit to all the premises. Also added climbs to the gazebos in the small green area, many passages and added the ability to use skills and shoot from lowlands and hills as usual. Shadows and lighting recreated. P.S. When creating the map, difficulties arose with different water levels in different maps, so I had to take the average water level as a basis.
    2 points
  6. Fixed in 1.8.7.1. There was an issue with UV texture coordinates being all set to 0 on new tiles.
    2 points
  7. After encountering issues with the current data.grf, I decided to start from scratch and overhaul the entire process. The result? A significantly reduced file size for the data.grf Previously, the data.grf weighed in at around 2.45GB, but now it’s down to just 2.15GB. In addition to the file size reduction, I’ve added 275~ mini maps to maps that were lacking them. The entire folder, including BGM, now stands at 2.96GB. What was done to the poor data.grf? Besides cleaning up unused sprites from npc and mob folders, now I converted all .BMP files to be 8bit, this doesn't affect quality on a game like RO, instead, it actually makes it easier for the client to handle those assets. .JPG and .PNG were treated as well but with some differences. Feel free to report any issue here
    2 points
  8. Prueba cambiando (BaseLevel/2) por status_get_lv(src)
    2 points
  9. src/status.cpp search for: // Skill-related recovery (only when sit) there you can edit the source. ^-^
    2 points
  10. 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
  11. I have multiple generator project, maybe u can try.
    2 points
  12. Here is another fully furbished Morroc Town! Join my Discord Channel: https://discord.gg/AhBjDJnEW3 Cinematic! morom.mp4
    2 points
  13. This is my new work Payon Town ROM! Join my Discord Channel: https://discord.gg/AhBjDJnEW3 Cinematic! payorm.mp4
    2 points
  14. Was having errors running my own 20220406 client, and this saved me. Thanks for this !
    2 points
  15. 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
  16. 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
  17. Not sure about Renewal, but in Pre-Renewal the damage of Auto-Blitz gets divided by number of targets, whereas actively using it doesn't.
    1 point
  18. Duplicate GvG map damage modiflier functions then create condition for check attacker was monster then do a multiplier there. (Try to use Find All in Visual Studio to find where to edit)
    1 point
  19. Official servers have a drop penalty on level difference, but many private server remove that "feature". I only play on pre-renewal servers so not sure how many there are that actually have a drop penalty.
    1 point
  20. 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
  21. You can add a skill in pc.cpp (src/map/pc.cpp) int pc_skillheal_bonus(map_session_data *sd, uint16 skill_id) { int bonus = sd->bonus.add_heal_rate; nullpo_ret(sd); skill_id = skill_dummy2skill_id(skill_id); if( bonus ) { switch( skill_id ) { case AL_HEAL: if( !(battle_config.skill_add_heal_rate&1) ) bonus = 0; break; case PR_SANCTUARY: if( !(battle_config.skill_add_heal_rate&2) ) bonus = 0; break; case AM_POTIONPITCHER: if( !(battle_config.skill_add_heal_rate&4) ) bonus = 0; break; case CR_SLIMPITCHER: if( !(battle_config.skill_add_heal_rate&8) ) bonus = 0; break; case BA_APPLEIDUN: if( !(battle_config.skill_add_heal_rate&16)) bonus = 0; break; case AB_CHEAL: if (!(battle_config.skill_add_heal_rate & 32)) bonus = 0; break; case AB_HIGHNESSHEAL: if (!(battle_config.skill_add_heal_rate & 64)) bonus = 0; break; case CD_MEDIALE_VOTUM: if (!(battle_config.skill_add_heal_rate & 128)) bonus = 0; break; case CD_DILECTIO_HEAL: if (!(battle_config.skill_add_heal_rate & 256)) bonus = 0; break; } } for (auto &it : sd->skillheal) { if (it.id == skill_id) { bonus += it.val; break; } } return bonus; } skill_add_heal_rate: 487 <--- means skill number designed, 1 = Heal Skill, 2 = Sanctuary Skill, etc so 487 means Heal + Sanctuary + Potion Pitcher + Cheal + highness heal + mediale + dialectio
    1 point
  22. 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
  23. 1 point
  24. Skill_db or source modification. It's depends on the skill. Skill_db o modificación de source. Depende del skill. Rynbef~
    1 point
  25. @Cydh or @Capuche I can't help. May u help him? Rynbef~
    1 point
  26. The condition for a status change is in status_get_sc_def: if (skill != nullptr && skill->skill_type == BF_MAGIC && // Basic magic skill !skill->inf2[INF2_IGNOREGTB] && // Specific skill to bypass ((skill->inf == INF_ATTACK_SKILL || skill->inf == INF_GROUND_SKILL || skill->inf == INF_SUPPORT_SKILL) || // Target skills should get blocked even when cast on self (skill->inf == INF_SELF_SKILL && src != bl))) // Self skills should get blocked on all targets except self return 0; If you really changed the skill used to "misc" then the status should never be blocked by GTB. Even easier would be to just use the "IgnoreGTB" flag. If it still doesn't work, then maybe it's already blocked in skill.cpp by something. Easiest is to just debug it. Put a breakpoint on the line I quoted above (first line) and see if it even reaches that code when you use the scroll.
    1 point
  27. Awesome! I think I should use a few things from ur great stuff. It's not only more for newbies. Rly great! Thank u for ur work and for sharing this stuff for free! Rynbef~
    1 point
  28. Hi, I didn't have to do anything to enable 4th jobs on my local server using (hexed) 20220406 ragexe on 2022 client data. Maybe you're missing the 4th jobs sprites while the server side works fine ?
    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. Hi, the new minimap option/feature is awesome, thank you for improving GRF Editor still.
    1 point
  31. yes it is. I tried making a 5v5v5v5v5 bg script before.
    1 point
  32. Sorry, yes, I added it like 30 mins prior reading your comment xD Ye, that's exactly what I was thinking
    1 point
  33. Oh I see! Sorry, I misread it xD I think that's only visual, because, if DirectX9 was really selected the FroggoClient wouldn't start.
    1 point
  34. This is not tested under renewal. I think it should still work, but test it with a GM character first. The default implementation of Homunculi is kind of obnoxious. When you create one, you get one of the homunculi at random, and in order to get another one, you have to completely delete them from existence. Wouldn't it be nice if you could keep the other homunculi to use later? Well, now you can! What it does: - When you use rest, the Homunculus returns to its Embyro. - You can use Call Homunculus to call it back out, just as it was when you rested it. - You can store the Homunculus for later use, allowing you to raise a different Homunculus, which is not normally possible. - Only you can call the Homunculus back out. If another alchemist tries to call it, it doesn't let them. - You can still delete the Homunculi as normal to remove them from existence completely. How it works from a technical perspective: - When you rest the homunculus, it is technically "removed" from you, similar to deleting it, but it returns an embyro with the Homunculus id set to its card[1] slot. - When you call out a Homunculus from an Embyro, if the embyro has a value in its card[1] slot, it restores that Homunculus instead of creating a new one. Some minor limitations: - It's not possible to distinguish embryos from each other, and call homunculus will always try to call the first one it finds in your inventory. You'll need to store the ones you don't want to raise right now, and it may take some trial and error to hatch the right one if you have a bunch. - The name display of the embryo doesn't work with the client I have (it seems like the client will only display the name if the card[1] slot is 0, which it's not if a homunculus is in there). This makes it hard to tell who owns a homunculus embyro. How to implement: Make the following code changes: In homunculus.cpp: Find the method "hom_vaporize": First, add the following variable declarations to the top, under the existing ones: int itemflag; struct item tmp_item; Next, comment out the following line: hd->homunculus.vaporize = flag ? flag : HOM_ST_REST; Then, insert the following at the end of the method, just before the return statement. if (hd->homunculus.intimacy > 0) { memset(&tmp_item, 0, sizeof(tmp_item)); tmp_item.nameid = 7142; 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; } Next, find the method "hom_call": Find this code: if (!sd->status.hom_id) //Create a new homun. return hom_create_request(sd, HM_CLASS_BASE + rnd_value(0, 7)) ; Replace it with this: struct item ed; int n; // find the embryo if (!sd->status.hom_id) { //Create or revive a homun. if ((n = pc_search_inventory(sd, 7142)) >= 0) { ed = sd->inventory.u.items_inventory[n]; } else { return false; // no embryo } 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)); } } Almost done, just one small change to make in skill.cpp. Find this line: if (sd->status.hom_id) //Don't delete items when hom is already out. And comment it out (we never want this method to delete the embyros, since the call method now handles it). Now just recompile your server and you should have the new homunculus behaviour.
    1 point
  35. View File [Event] Chess 1.0 [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. Submitter MihaSenpai Submitted 03/20/24 Category Games, Events, Quests Video Content Author MihaSenpai  
    1 point
  36. Most of you who use fishing scripts on your server have probably checked out my Fishing Script before...Well I've been working on currently enhancing it. Changelog: v1.2 Shortened most of the script Added Sounds and Effects to make it a bit more lively Added two new Configurations - Auto Fish, Auto Fish on fail Enhanced map announce to work with where-ever the script is located Enhanced randomizing caught junk to enable a lot more to be added Removed Chat menu so the script has less clicking Fishing 1.2.txt This one is slightly different then the one below. Fishing 1.2.txt Please read Optional-Addons before using this script. Optional Add-ons Upcoming Changes This script has been abandoned to start work on a Profession System.
    1 point
  37. A very small post, but I wanted to share something in case anyone else ever runs across it. As I've mentioned previously, my server contains the maps from the alpha, albeit with new monsters and warp points and such. However, there's a strange problem on one of the alpha maps. On pro_fild01, there's this bizarre culling issue where parts of the map will sometimes disappear while you're walking through it (look at the top part) It flickers on and off while you walk through the map and is generally very annoying. But what's going on? No other map in the game does this. I decided to try to investigate it in the map editor. Everything looks normal enough. There's nothing in the map to indicate any "culling zones" or anything strange like that. I even tried replacing the rsw with one from another map of the same size and the problem persists. The one thing I noticed is that if you look at the map boundary, the map is actually sunk below it (notice how the yellow walls are above the map rather than below), which is a bit weird. Actually, most of this map is sunk pretty far into the ground, with many parts having Y values in the 30s and 40s. I decided to try moving the entirety of the map up by 50 units, to see if the height of the map was the problem. Note that the map now sits above the yellow wall. This is not too hard using the "global height edit" function, which also thankfully adjusts the GAT tiles. However, it was also necessary to manually adjust the height of each object, which was moderately time consuming but not difficult using the object list. And surprisingly, it works! The weird culling effect is eliminated and the map displays normally now. So it seems like the game has issues if map geometry goes too far below the ground, though this isn't an issue on any other official maps that I've seen. I wonder if this bug existed in the alpha? My guess is that the client worked slightly differently back then so this issue didn't occur, but who knows.
    1 point
  38. The Sage of Six Path Naruto The Sage of Six Path Cloak The legendary Super Saiyan Luminous Wings Ancient Dragon Wings Lucifer Wings Touka's Kagune (Might change this animation) Merged Zamasu's Set Super Saiyan Aura.rar
    1 point
  39. 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
  40. I saw a lot of posts about this over the years, but none seemed updated for the most recent version. I recently spent a lot of time on pets, so here's a quick guide. I did everything for pre-renewal, but I would imagine most of this would work for renewal too, you might just need to add some stuff about evolution. What you'll need: GRF Editor SDE (Server Database Editor) Both of these can be found elsewhere on this forum and are used for most things involving editing your server. Understanding GRF files: When the client needs a file, it searches through the GRF files in a certain order to find it. The order it uses is specified in data.ini in the client's root folder. Mine looks like this. [Data] 0=rathena_resources.grf 1=pre20190427.grf 2=renewal20190427.grf 3=palettes.grf 4=data.grf 5=rdata.grf It looks in files that are higher in the list first. This means rathena_resources.grf is checked first, and rdata.grf is checked last. This means that if I need to override a file which is normally in data,grf, I can simply add it to any grf file that is higher in the list, and it will be used instead of the one in data.grf, without having to modify that file. Since rathena_resources.grf is first in the list, it's easiest to add your files to that. Getting started with your custom pet: The first two things your pet needs are an egg and a taming item. For eggs, I simply chose to replace an existing pet egg that was unused. In Pre-Re, there aren't any unused eggs, but we can fix that. In a text editor, open up the item_db.txt file for renewal, which is under your db/re folder. Search for 9001, which will get you to the beginning of the pet eggs. Renewal has tons of them! Copy and paste all the eggs that renewal's item_db has into pre-re's item db, and now they'll be available for pre-re to use. Now open up SDE. To add an egg for your new pet, all we have to do is rename it. Use the item search and find an egg you don't care about. Change its Aegis Name and Name to be the one of the pet you want. For example, I made Garm Baby, so the Aegis name is Garm_Baby_Egg and the Name is Garm Baby Egg. This part is done. Now we need a taming item. It's easiest to make a taming item by using a miscellaneous item. For Garm Baby, I used Nursing Bottle. To turn this item into a taming item, first we have to change it from a Misc Item to a Usable item, which is done using the dropdown in the upper right. We then need to set the Applicable Job to FFFFFFFF, upper to 7, and Gender to Both. Now we need to set the script. The script must look like this: pet 1515; Except that the number must match the id number of the enemy you want to be able to capture. Look this up in the mob database. You might want to modify the drop rates on your item through the mob database too, particularly if it's an item that no one in the game drops. Most pet items also have a sell price of 2500 and a weight of 50, if you want to be consistent. Use "save database (quick)" to save your changes. We're done with SDE for now. Adding your pet to the game: The next thing to do is to add your pet to pet_db.yml so it can spawn into the game. The installation I have actually breaks pet_db.yml into two parts. There's one file inside pre-re that contains the pet's basic information, and one inside import that contains its skill information. You could merge these files if you wanted, but if not you'll need to update both. There are already a bunch of entries in this file, so you can probably just copy one. Note that when it comes to yaml files, the spacing of the file is important, so make sure you copy it exactly including the spacing. Here's the one I used for Garm Baby. - Mob: GARM_BABY TameItem: Milk_Bottle EggItem: Garm_Baby_Egg FoodItem: Ice_Piece Fullness: 4 IntimacyFed: 10 CaptureRate: 500 Script: > .@i = getpetinfo(PETINFO_INTIMATE); if( .@i >= PET_INTIMATE_LOYAL ){ bonus2 bResEff,Eff_Freeze,5000; } The entries for MOB, TameItem, EggItem, and FoodItem are all Aegis_Names, you can look these up through SDE. For example, the Nursing Bottle's Aegis Name is actually Milk_Bottle. The script is something you'll have to come up with on your own. There's a bunch of examples in the file already you can draw on. My script makes the pet give you 50% resistance to the freeze status. If you want the pet to use skills, you'll need to update the other yml file inside import. Garm Baby has this inside that file: - Mob: GARM_BABY AttackRate: 8000 RetaliateRate: 8000 ChangeTargetRate: 800 SupportScript: > petskillattack "MG_FROSTDIVER",5,10,30; The main thing we care about is the SupportScript. This is what attack your pet will use. Here, this pet uses Frost Driver level 5, between 10-30% of the time depending on how happy it is. For a support skill, you use petskillsupport instead, with values like this one: petskillsupport "HP_ASSUMPTIO",1,80,100,100; This pet would cast Assumptio level 1 with an 80 second delay, when your hp and sp are 100% or less. There's also stat bonuses available: petskillbonus bLuk,5,20,40; This pet gives a bonus of 5 luck for 20 seconds, with a 40 second delay between uses. For more detail, look in script_commands.txt within Rathena's doc folder. With this, you can now restart your server and your pet will exist in the game! There will still be a bit of jank, for example its egg won't show the right name on the client, it won't have a picture, and it won't talk, we'll discuss how to fix that next. Fixing your pet's egg entry: This one is fairly easy. Navigate to your client folder and open up System/iteminfo.lua This is where the game stores all the item translations. Find the egg that you used by searching for its item id inside square brackets, like this [9001]. The description will be listed here. If you added a completely new egg, it won't be in this file and you'll need to add an entry for it. Update the name so it shows the right name. You can also add a description if you want. Mine looks like this, but it doesn't need to be this fancy. [9108] = { unidentifiedDisplayName = "Garm Baby Egg", unidentifiedResourceName = "¾ðµ¥µå¾Ë", unidentifiedDescriptionName = { "..." }, identifiedDisplayName = "Garm Baby Egg", identifiedResourceName = "¾ðµ¥µå¾Ë", identifiedDescriptionName = { "An egg in which a Garm Baby Cute Pet rests.", "Can be hatched by using a ^33CC33Pet Incubator^000000.", "^33CC33Special Power ^000000:", "Casts level 5 Frost Driver against the enemy", "^33CC33Loyal Bonus^000000", "Increases resistance to the Freeze status by 50%", "Class:^6666CC Monster Egg^000000" }, slotCount = 0, ClassNum = 0 }, Adding a picture for your pet: Every pet has a little picture that is displayed in their pet window. If you don't do this step, it'll just display NO IMAGE. This is not cool, so let's add an image. This requires GRF editor. To start with, you should probably open up data.grf, just to know how it's structured. Images for pets are stored in data/texture/userinterface/illust . If you search this folder for "pet", you'll see the existing images. They are all 90x134 pixels, your image will need to be this size too. Name it something like pet_garm_baby.bmp. You could just upload your file into data.grf, but data.grf is huge and thus it's slow to send update to this file to your players. Instead, it's easier to put it into rathena_resources.grf. It does not have this folder, but you can create it using GRF editor. Remember, any files you put inside something higher in the list of GRF files will override the earlier files. After adding your file, you'll notice that it won't actually display in game. This is because there is also a table of pets in the application that maintains the paths to the images that you need to update. This file is called petinfo.lub, and it is stored inside data.grf in the folder data/luafiles514/lua files/datainfo. We'll need to make a copy of this file, so extract it using right click extract with GRF editor. This file needs specific encoding to read the Korean characters, so make sure to save the file with ANSI encoding when you're done. There are many tables in this file that you'll need to add your pet to. Generally, you can follow the format they use. You'll notice that most of the entries use an identifier that looks like this: [jobtbl.JT_GARM_BABY] = "GARM_BABY", This is an entry into the file jobidentity.lub, which is in the same folder. You should not need to modify that file, pretty much every enemy in the game is already in there, just enter your pet's Aegis name here, in all caps. When you come to this table: PetEggItemID_PetJobID You'll need to give your pet a new JobID, you can just assign a new one at the end. When you're finished updating this file, add it into your rathena_resources.grf, making the same folder path for it as above, so it will overwrite the one in the base game. Make sure to save your GRF afterwards. If you find that the pet accessories on your server no longer work after doing this, you saved the file with the wrong encoding. I fixed this by switching all the pet accessory files to the english names and adding them all to my GRF files, but the smart way is probably just to use a text editor that handles encoding properly, like notepad++. Making your pet talk: To make your pet talk, it needs entries in pettalktable.xml. For me, this file was in my renewal.grf file, in the data folder. This is fairly straightforward, you can just copy and then modify Poring's entry. You just need to know what to put for the enclosing tags. The name must match the entry you made in the PetNameTable inside petinfo.lub. I put the name "GARM_BABY" for my pet, so the tag must say <GARM_BABY>. For some reason, my pets only talked when I put their entries near the beginning of the file. I suspect one of the entries inside the default file has an error in it, but I haven't found it. Either way, adding them to the top of the file is safe. With all of this stuff done, just save your GRF edits and restart the game (it's not necessary to restart the server for GRF changes) and hopefully your pet should talk and have a picture! Once you confirm everything works, you'll need to distribute the changed grf files and iteminfo.lua to your players. It's probably worth adding all your custom pets to the server first before you open in to the public! I'm sorry that this was long, no one said custom pets were going to be easy. Hopefully it all works for you.
    1 point
  41. Olá a todos! por muito tempo me dediquei ao ragnarok, aprimorando-o de alguma forma e depois de vários anos ganhei experiência de todos os lados, consigo entender o cliente perfeitamente, modificar feitiço entre tantas outras coisas muito legais, no final decidi criar o meu Brinco com todas as coisas que aprendi, e hoje está em desenvolvimento, mas hoje colocarei aqui a maior vitrine de todas as coisas que terminei ou converti para RO. aqui você vai encontrar sprites, monstros, efeitos e outros .. alguns eu fiz a pedido de algum cliente outros foram feitos só para o meu jogo. Efeitos: Tags: Monstros: Hp Bar custom ? Efeitos de LevelUp: Temas de danos: Itens / Auras: Asas 3d Outros: Vou postar mais coisas legais! obrigado
    1 point
  42. ~~ 4th class update ~~ Egnigem - Wikebine - Laurell - Errende - Josephina - Kavach - Armeyer Seyren - Eremes - Kathryne - Margaretha - Cecil - Howard & Madogear Randel - Gertie - Celia - Chen - Trentini - Alphoccio - Flamel The main idea behind sprites with two types of attack is that they can be used as: 1. different ordinary monsters with only one type of attack initially 2. monsters with the ability to transform one into another depending on the use of skills by players or randomly Main examples of use for such sprites: 1.1. Celia / Laurell with a staff / book has a casting time and normal delay when using one of the types of magic bolts from a distance and near 1.2. Celia / Laurell with a knife uses instant magic bolts on melee attacks (as if she / he had Auto-Spell enabled) 2.1. Margaretha with a staff can cast protective spells on monsters around her and attack with normal speed (like supportive priest) 2.2. Margaretha with the book casts protective spells only on herself and attack way more faster (like battle priest) 3. Wikebine / Gertie / Josephina / Trentini / Kavach / Alphoccio with the ability to melee attack and carry a bow can randomly change the type of attack from ranged to melee and from melee to ranged to prevent players using Pneuma (Cecil is the exception, as a professional archer only) There is an example of a sprite naming system:
    1 point
  43. Hello people~ I am Adel and this is my updated sprite showcase. ❤ ❤ ❤ Hope you enjoy ❤ ❤ ❤ Note: Please do not steal the display images. Some of the references for my sprites were taken from other game sources. Mob Sprites Other Sprites
    1 point
  44. Send an e-mail to hotmail Send an e-mail to gmail with a attachment e-mail system logs file (time,operator,receiver,subject,body) Download Source Code : email.patch E-Mail System.txt Download VBScript (Must put into your server program folder) : sendemail.zip Set : Open sendemail.vbs (with txt), write your mail account into Const fromEmail and password into Const password. If your e-mail server is gmail (Google), you will not not need to do anything after that. if not, you have to search that server stmp and port. Script Sample : email "receiver","subject","body","attachment"; input .@a$; input .@s$; input .@b$; mes "To:"+.@a$; mes "Subject:"+.@s$; mes "Body:"+.@b$; select("OK"); //set .@att$,"D:/eAthena/UpgradeLog.XML"; //attachment email .@a$,.@s$,.@b$,.@att$; close; PS : Testing \ Works in Windows7 OS. Warning : If this lead to SPAM, CRASH or ANYTHING BAD, I will not help you and be responsible for it. So checking all before using it.
    1 point
  45. I just tried on client 2018-06-21aRagexeRE thanks so much @melv0 1. How to change the maximum level of your server? https://gist.github.com/cydh/d82a06472f12c4ec7f38ab3de22fe86b 2. How to make the aura appear at a maximum level other than 99? data\luafiles514\lua files\service_korea\ExternalSettings_kr.lub & externalsettings_kr_sak.lub MaxLevelTable = { BaseLevel = 99, << Edit this part into 255 BaseLevel3rd = 185, BaseLevelExtend2 = 160, BaseLevelUpperJob = 185, BaseLevelHomun = 185, BaseLevelDoram = 185, JobLevelNovice = 10, JobLevelSuperNovice = 99, JobLevelBase = 50, JobLevel2nd = 70, JobLevel3rd = 65, JobLevelExtend2 = 50, JobLevelUpperJob = 60, JobLevelDoram = 55 } and that's it, see magic ingame ?
    1 point
  46. Client-Side Just name the files as morocc (for morroc) and payon (for payon) then add in your data. Server-Side First be sure your grf-files.txt in your conf folder is properly configurated. //grf: C:\Program Files\Gravity\RO\data.grf >>Add your grf here just like the model //----------------------------------------- // Data Directory // Use the base folder, not the data\ path. //----------------------------------------- //data_dir: C:\Program Files\Gravity\RO\ >>Add your RO folder here just like the mode Then using WeeMapCache Open your mapcache.dat (in db folder) and delete the payon and morocc from the list, save and close your mapcache. Run the mapcache.bat in the trunk folder of the emulator (the main folder) and the maps will take place of the current ones. NOTE: you must have to fix the NPC and Portal positions Manually.
    1 point
  47. specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,620000,10; specialeffect2 EF_BLESSING; sc_start SC_BLESSING,620000,10; here.
    1 point
  48. All old maps are in our download section: https://rathena.org/board/files/file/7-old-payon-morocc-10/ https://rathena.org/board/files/file/2392-old-izlude-and-alberta/
    1 point
×
×
  • Create New...