Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation since 03/16/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.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. 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. src/status.cpp search for: // Skill-related recovery (only when sit) there you can edit the source. ^-^
    2 points
  6. 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. 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
  7. I have multiple generator project, maybe u can try.
    2 points
  8. Here is another fully furbished Morroc Town! Join my Discord Channel: https://discord.gg/AhBjDJnEW3 Cinematic! morom.mp4
    2 points
  9. This is my new work Payon Town ROM! Join my Discord Channel: https://discord.gg/AhBjDJnEW3 Cinematic! payorm.mp4
    2 points
  10. Was having errors running my own 20220406 client, and this saved me. Thanks for this !
    2 points
  11. 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
  12. 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
  13. 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.
    2 points
  14. 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
  15. Already answered your question in discord.
    2 points
  16. 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
  17. Alright, i got my own excel, you can modify the excel by drag it down the row to generate more level if you want.. Here i will share to you guys. job_exp (base) 1-1000.xls job_exp (job) 1-255.xlsstatpoint (1 - 1000).xls After that you can use this link to convert excel to yaml, hen copy it : https://tableconvert.com/excel-to-yaml Then you can go to db/re/job_exp.yml then paste what you needed. Sorry i cant share my own yml, dont ask me! Sorry for bad english
    2 points
  18. These are some examples, I have more than 30 bosses ready, 80 different monsters like mobs and mini boss, between wings, weapons, etc. If you liked it, don't forget to like it, thank you all.
    2 points
  19. 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
  20. Hola, creo que rAthena tiene más soporte y actualizaciones. 1- Abre \npc\re\scripts_jobs.conf. Encuentra y comenta estas líneas: // - 3-1 npc: npc/re/jobs/3-1/archbishop.txt npc: npc/re/jobs/3-1/mechanic.txt npc: npc/re/jobs/3-1/ranger.txt npc: npc/re/jobs/3-1/rune_knight.txt npc: npc/re/jobs/3-1/warlock.txt npc: npc/re/jobs/3-1/guillotine_cross.txt // - 3-2 npc: npc/re/jobs/3-2/genetic.txt npc: npc/re/jobs/3-2/minstrel.txt npc: npc/re/jobs/3-2/royal_guard.txt npc: npc/re/jobs/3-2/shadow_chaser.txt npc: npc/re/jobs/3-2/sorcerer.txt npc: npc/re/jobs/3-2/sura.txt npc: npc/re/jobs/3-2/wanderer.txt 2- NPC actualizado: prontera,153,193,6 script Job Master 123,{ function Get_Job_Equip; // Checks if the Player has the required level. // closes if not, returns if yes function Require_Level { if (BaseLevel < getarg(0) || JobLevel < getarg(1)) { .@blvl = getarg(0) - BaseLevel; .@jlvl = getarg(1) - JobLevel; mes "Level requirement:"; mes ((getarg(0)>1)? "^bb0000"+getarg(0)+"^000000 (^bb0000Base^000000) / ":"")+"^00bb00"+ getarg(1)+"^000000 (^00bb00Job^000000)"; mes "You need " + ((.@blvl > 0) ? "^bb0000"+.@blvl+"^000000 more base levels " + ((.@jlvl > 0) ? "and " : "") : "") + ((.@jlvl > 0) ? "^00bb00"+.@jlvl+"^000000 more job levels " : "") + "to continue."; close; } return; } // Checks if the given eac is a baby class function Is_Baby { return ((getarg(0, eaclass())&EAJL_BABY)>0); } // Checks if the player can change to third class. // Note: This does not include the level checks. function Can_Change_Third { // To change to third class you either need to be: // * Second Class // * Transcendent Second Class // * Baby Second Class if( !.ThirdClass ) return false; // Third job change disabled if( !(eaclass()&EAJL_2) ) return false; // Not second Class if( eaclass()&EAJL_THIRD ) return false; // Already Third Class if( roclass(eaclass()|EAJL_THIRD) < 0 ) return false; // Job has no third Class if( (eaclass()&EAJ_UPPERMASK) == EAJ_SUPER_NOVICE ) return false; // Exp. Super Novice equals 3rd Cls, but has it's own case if( Is_Baby() && (!.BabyClass || !.BabyThird) ) return false; // No Baby (Third) change allowed return true; } function Can_Rebirth { // To rebirth, you need to be: // * Second Class if( !.RebirthClass ) return false; // Rebirth disabled if( !(eaclass()&EAJL_2) ) return false; // Not second Class if( eaclass()&(EAJL_UPPER|EAJL_THIRD) ) return false; // Already Rebirthed/ Third Class if( roclass(eaclass()|EAJL_UPPER) < 0 ) return false; // Job has no transcended class if( Is_Baby() && !.BabyClass ) return false; // No Baby changes allowed return true; } // Checks if the given eac is a first class function Is_First_Cls { return (getarg(0) <= EAJ_TAEKWON); } function Check_Riding { // Note: Why we should always check for Riding: // Mounts are considered as another class, which // would make this NPC bigger just to handle with // those special cases. if (checkfalcon() || checkcart() || checkriding() || ismounting()) { mes "Please remove your " + ((checkfalcon()) ? "falcon" : "") + ((checkcart()) ? "cart" : "") + ((checkriding()) ? "Peco" : "") + ((ismounting()) ? "mount" : "") + " before proceeding."; close; } return; } function Check_SkillPoints { if (.SkillPointCheck && SkillPoint) { mes "Please use all your skill points before proceeding."; close; } return; } // addJobOptions is essentially the same like // setarray .@array[getarraysize(.@array)],opt1,opt2,...; // It's just easier to read, since we're using it very often function Job_Options { .@argcount = getargcount(); .@arr_size = getarraysize(getarg(0)); for( .@i = 1; .@i < .@argcount; .@i++) { setarray getelementofarray(getarg(0), .@arr_size++),getarg(.@i); } } // Begin of the NPC mes .NPCName$; Check_Riding(); Check_SkillPoints(); // initialisation .@eac = eaclass(); .@third_possible = Can_Change_Third(); .@rebirth_possible = Can_Rebirth(); .@first_eac = .@eac&EAJ_BASEMASK; .@second_eac = .@eac&EAJ_UPPERMASK; // Note: These are already set in pc.cpp // BaseClass = roclass(.@eac&EAJ_BASEMASK) which is the players First Class // BaseJob = roclass(.@eac&EAJ_UPPERMASK) which is the players Second Class //dispbottom "Debug: eac ("+.@eac+"), third ("+.@third_possible+"), rebirth("+.@rebirth_possible+"), BaseClass ("+BaseClass+"), BaseJob ("+BaseJob+")"; // From here on the jobmaster checks the current class // and fills the the array `.@job_opt` with possible // job options for the player. if( .@rebirth_possible ) { if (.JumpRebirth) { // SALTAR AL TRASCENDENTE Require_Level(.Req_Second[0], .Req_Second[1]); Job_Options(.@job_opt, Class + Job_Novice_High); } else { // Rebirth option (displayed on the top of the menu) Require_Level(.Req_Rebirth[0], .Req_Rebirth[1]); Job_Options(.@job_opt, Job_Novice_High); } } if( .@third_possible ) { // Third Job change (displayed below rebirth) Require_Level(.Req_Third[0], .Req_Third[1]); Job_Options(.@job_opt, roclass(.@eac|EAJL_THIRD)); } if (.SecondExpanded && (.@eac&EAJ_UPPERMASK) == EAJ_SUPER_NOVICE && // is Super Novice !(eaclass()&EAJL_THIRD) ) { // not already Expanded SN // (Baby) Super Novice to Expanded (Baby) Super Novice if( !Is_Baby(.@eac) || (.BabyClass && .BabyExpanded) ) { // .BabyClass & .BabyExpanded must be enabled if the is a baby Require_Level(.Req_Exp_SNOVI[0], .Req_Exp_SNOVI[1]); Job_Options(.@job_opt,roclass(.@eac|EAJL_THIRD)); // Expanded SN is "third" cls } } if (.SecondExpanded && ((.@eac&(~EAJL_BABY)) == EAJ_NINJA || // is (Baby) Ninja (.@eac&(~EAJL_BABY)) == EAJ_GUNSLINGER)) { // is (Baby) Gunslinger // (Baby) Ninja to (Baby) Kagerou / Oboro // (Baby) Gunslinger to (Baby) Rebellion if( !Is_Baby(.@eac) || (.BabyClass && .BabyExpanded) ) { // .BabyClass & .BabyExpanded must be enabled if the is a baby Require_Level(.Req_Exp_NJ_GS[0], .Req_Exp_NJ_GS[1]); // Kagerou, Oboro, Rebellion are considered as a 2-1 class Job_Options(.@job_opt, roclass(.@eac|EAJL_2_1)); } } // Player is Job_Novice, Job_Novice_High or Job_Baby if (.@first_eac == EAJ_NOVICE && .@second_eac != EAJ_SUPER_NOVICE) { // MAPID_NOVICE, MAPID_SUPER_NOVICE, MAPID_NOVICE_HIGH, MAPID_BABY Require_Level(.Req_First[0], .Req_First[1]); switch(Class) { case Job_Novice: // First job change Job_Options(.@job_opt,Job_Swordman, Job_Mage, Job_Archer, Job_Acolyte, Job_Merchant, Job_Thief, Job_Super_Novice, Job_Taekwon, Job_Gunslinger, Job_Ninja); if( .BabyNovice ) Job_Options(.@job_opt, Job_Baby); break; case Job_Novice_High: // Job change after rebirth if( .LastJob && lastJob ) Job_Options(.@job_opt, roclass((eaclass(lastJob)&EAJ_BASEMASK)|EAJL_UPPER)); else Job_Options(.@job_opt, Job_Swordman_High, Job_Mage_High, Job_Archer_High, Job_Acolyte_High, Job_Merchant_High, Job_Thief_High); break; case Job_Baby: if( !.BabyClass ) break; // First job change as a baby Job_Options(.@job_opt, Job_Baby_Swordman, Job_Baby_Mage, Job_Baby_Archer,Job_Baby_Acolyte, Job_Baby_Merchant, Job_Baby_Thief); if( .BabyExpanded ) Job_Options(.@job_opt, Job_Super_Baby, Job_Baby_Taekwon, Job_Baby_Gunslinger, Job_Baby_Ninja); if( .BabySummoner ) Job_Options(.@job_opt, Job_Baby_Summoner); break; default: mes "An error has occurred."; close; } } else if( Is_First_Cls(.@eac) || // First Class Is_First_Cls(.@eac&(~EAJL_UPPER)) || // Trans. First Cls (.BabyClass && Is_First_Cls(.@eac&(~EAJL_BABY))) ) { // Baby First Cls // Player is First Class (not Novice) // most jobs should have two options here (2-1 and 2-2) .@class1 = roclass(.@eac|EAJL_2_1); // 2-1 .@class2 = roclass(.@eac|EAJL_2_2); // 2-2 // dispbottom "Debug: Classes: class1 ("+.@class1+"), class2 ("+.@class2+")"; if(.LastJob && lastJob && (.@eac&EAJL_UPPER)) { // Player is rebirth Cls and linear class changes are enforced Require_Level(.Req_Second[0], .Req_Second[1]); Job_Options(.@job_opt, lastJob + Job_Novice_High); } else { // Class is not enforced, player can decide. if( .@class1 > 0 ) { // 2-1 Require_Level(.Req_Second[0], .Req_Second[1]); Job_Options(.@job_opt, .@class1); } if( .@class2 > 0 ) { // 2-2 Require_Level(.Req_Second[0], .Req_Second[1]); Job_Options(.@job_opt, .@class2); } } } // Displaying the Job Menu defined by .@job_opt. // .@job_opt should not be changed below this line. function Job_Menu; Job_Menu(.@job_opt); close; // Displays the job menu function Job_Menu { // getarg(0) is the .@job_opt array holding all available job changes. function Confirm_Change; while(true) { .@opt_cnt = getarraysize(getarg(0)); if( .@opt_cnt <= 0 ) { mes "No more jobs are available."; close; } .@selected = 0; // Just a single job class given, no select needed if (.@opt_cnt > 1) { // Multiple job classes given. Select one and save it to .@class // After that confirm .@class mes "Select a job."; .@menu$ = ""; for (.@i = 0; .@i < .@opt_cnt; .@i++) { if( getelementofarray(getarg(0), .@i) == Job_Novice_High) .@jobname$ = "^0055FFRebirth^000000"; else .@jobname$ = jobname(getelementofarray(getarg(0), .@i)); .@menu$ = .@menu$ + " ~ " + .@jobname$ + ":"; } .@menu$ = .@menu$+" ~ ^777777Cancel^000000"; .@selected = select(.@menu$) - 1; if( .@selected < 0 || .@selected >= .@opt_cnt ) close; next; mes .NPCName$; } .@class = getelementofarray(getarg(0), .@selected); if ((.@class == Job_Super_Novice || .@class == Job_Super_Baby) && BaseLevel < .SNovice) { // Special Level Requirement because Super Novice and // Super Baby can both be selected in one of the first class // changes. That's why the Level Requirement is after and not before // the selection. mes "A base level of " + .SNovice + " is required to turn into a " + jobname(.@class) + "."; return; } // Confirm the Class Confirm_Change(.@class, .@opt_cnt > 1); next; mes .NPCName$; } return; } // Executes the actual jobchange and closes. function Job_Change { .@previous_class = Class; .@to_cls = getarg(0); next; mes .NPCName$; mes "You are now " + callfunc("F_InsertArticle", jobname(.@to_cls)) + "!"; if (.@to_cls == Job_Novice_High && .LastJob) lastJob = Class; // Saves the lastJob for rebirth jobchange .@to_cls; if (.@to_cls == Job_Novice_High) resetlvl(1); else if (.@to_cls == Job_Baby) { resetstatus; resetskill; set SkillPoint,0; } specialeffect2 EF_ANGEL2; specialeffect2 EF_ELECTRIC; if (.@previous_class != Class) { if (.Platinum) callfunc "F_GetPlatinumSkills"; if (.GetJobEquip) Get_Job_Equip(); } close; // Always closes after the change } function Confirm_Change { // Player confirms he want to change into .@class .@class = getarg(0, -1); .@back = getarg(1, false); if( .@class < 0 || eaclass(.@class) == -1 ) { mes "Unknown Class Error."; close; } mes "Do you want to change into ^0055FF"+jobname(.@class)+"^000000 class?"; .@job_option$ = " ~ Change into ^0055FF"+jobname(.@class)+"^000000 class"; if( .@class == Job_Novice_High) .@job_option$ = " ~ ^0055FFRebirth^000000"; if (select(.@job_option$+": ~ ^777777" + ((.@back) ?"Go back" : "Cancel") + "^000000") == 1) { Job_Change(.@class); } if (!.@back) close; // "Cancel" pressed return; } // Function which gives a job related item to the player // the items are the rewards from the original job change quests function Get_Job_Equip { // Note: The item is dropping, when the player can't hold it. // But that's better than not giving the item at all. .@eac = eaclass(); if( .@eac&EAJL_THIRD ) { // Third Class Items getitem 2795,1; // Green Apple Ring for every 3rd Class switch(BaseJob) { // BaseJob of Third Cls // For Normal Third, Baby Third and Transcended Third Cls case Job_Knight: getitem 5746,1; break; // Rune Circlet [1] case Job_Wizard: getitem 5753,1; break; // Magic Stone Hat [1] case Job_Hunter: getitem 5748,1; break; // Sniper Goggle [1] case Job_Priest: getitem 5747,1; break; // Mitra [1] case Job_Blacksmith: getitem 5749,1; break; // Driver Band [1] case Job_Assassin: getitem 5755,1; break; // Silent Executor [1] case Job_Crusader: getitem 5757,1; break; // Dip Schmidt Helm [1] case Job_Sage: getitem 5756,1; break; // Wind Whisper [1] case Job_Bard: getitem 5751,1; break; // Maestro Song's Hat [1] case Job_Dancer: getitem 5758,1; break; // Dying Swan [1] case Job_Monk: getitem 5754,1; break; // Blazing Soul [1] case Job_Alchemist: getitem 5752,1; break; // Midas Whisper[1] case Job_Rogue: getitem 5750,1; // Shadow Handicraft [1] getitem 6121,1; // Makeover Brush getitem 6122,1; break; // Paint Brush } } else if (.@eac&EAJL_2) { // Second Class (And not Third Class) switch(BaseJob) { // Second Class case Job_Knight: getitem 1163,1; break; // Claymore [0] case Job_Priest: getitem 1522,1; break; // Stunner [0] case Job_Wizard: getitem 1617,1; break; // Survivor's Rod [0] case Job_Blacksmith: getitem 1360,1; break; // Two-Handed-Axe [1] case Job_Hunter: getitem 1718,1; break; // Hunter Bow [0] case Job_Assassin: getitem 1254,1; break; // Jamadhar [0] case Job_Crusader: getitem 1410,1; break; // Lance [0] case Job_Monk: getitem 1807,1; break; // Fist [0] case Job_Sage: getitem 1550,1; break; // Book [3] case Job_Rogue: getitem 1222,1; break; // Damascus [1] case Job_Alchemist: getitem 1126,1; break; // Saber [2] case Job_Bard: getitem 1907,1; break; // Guitar [0] case Job_Dancer: getitem 1960,1; break; // Whip [1] case Job_Super_Novice: getitem 1208,1; break; // Main Gauche [4] case Job_Star_Gladiator: getitem 1550,1; break; // Book [3] case Job_Soul_Linker: getitem 1617,1; break; // Survivor's Rod [0] } } else { // Neither Second or Third Cls // => First Cls or not covered by the switch switch(BaseClass) { // First Class case Job_Swordman: getitem 1108,1; break; // Blade [4] case Job_Mage: getitem 1602,1; break; // Rod [4] case Job_Archer: getitem 1705,1; break; // Composite Bow [4] case Job_Acolyte: getitem 1505,1; break; // Mace [4] case Job_Merchant: getitem 1302,1; break; // Axe [4] case Job_Thief: getitem 1208,1; break; // Main Gauche [4] case Job_Gunslinger: getitem 13101,1; break; // Six Shooter [2] case Job_Ninja: getitem 13010,1; break; // Asura [2] } } return; } OnInit: // Initialisation, do not edit these .NPCName$ = "[Job Master]"; // Settings .ThirdClass = false; // Enable third classes? .RebirthClass = true; // Enable rebirth classes? .SecondExpanded = true; // Enable new expanded second classes: Ex. Super Novice, Kagerou/Oboro, Rebellion? .BabyNovice = true; // Enable Baby novice classes? Disable it if you like player must have parent to get job baby. .BabyClass = true; // Enable Baby classes? .BabyThird = false; // Enable Baby third classes? .BabyExpanded = true; // Enable Baby Expanded classes: Ex. Baby Ninja, Baby Taekwon, etc. .BabySummoner = true; // Enable Baby Summoner? .LastJob = true; // Enforce linear class changes? .SkillPointCheck = true; // Force player to use up all skill points? .Platinum = true; // Get platinum skills automatically? .GetJobEquip = false; // Get job equipment (mostly weapons) on job change? .JumpRebirth = true; // SALTAR AL TRASCENDENTE // Level Requirements setarray .Req_First[0],1,10; // Minimum base level, job level to turn into 1st class setarray .Req_Second[0],1,40; // Minimum base level, job level to turn into 2nd class setarray .Req_Rebirth[0],99,50; // Minimum base level, job level to rebirth setarray .Req_Third[0],99,50; // Minimum base level, job level to change to third class setarray .Req_Exp_NJ_GS[0],99,70; // Minimum base level, job level to turn into Expanded Ninja and Gunslinger setarray .Req_Exp_SNOVI[0],99,99; // Minimum base level, job level to turn into Expanded Super Novice .SNovice = 45; // Minimum base level to turn into Super Novice // Setting adjustments by PACKETVER if( PACKETVER < 20161207 ) { if( .BabyExpanded ) debugmes "jobmaster: BabyExpanded is disabled due to outdated PACKETVER."; if( .BabySummoner ) debugmes "jobmaster: BabySummoner is disabled due to outdated PACKETVER."; .BabyExpanded = false; .BabySummoner = false; } end; } 3- Sí.
    1 point
  21. Hi. Try this one if you do not want to use instance system, modified from AnnieRuru' Private MVP & Branch Room in \npc\custom\etc\mvp_room.txt //===== rAthena Script ======================================= //= Private MVP & Branch Room //===== By: ================================================== //= AnnieRuru //===== Current Version: ===================================== //= 1.0 //===== Compatible With: ===================================== //= rAthena Project //===== Description: ========================================= //= Allows players to rent an MVP room for personal use, //= or for a party or guild. //===== Additional Comments: ================================= //= 1.0 First version, edited. [Euphy] //============================================================ prontera,148,174,5 script DB Room Manager 4_F_RUSGREEN,{ mes "[^EFCC00 DB Room Manager ^000000]"; mes "How are thing with you?", " "; mes "I offer two types of DB Room. Choose what best suits your need."; switch(select("Public DB Room", "Private DB Room", "Buy Branches", "Cancel")) { case 1: .@room = select( "Enter Room 1 ["+ getmapusers("06guild_01") +"]", "Enter Room 2 ["+ getmapusers("06guild_02") +"]", "Enter Room 3 ["+ getmapusers("06guild_03") +"]", "Enter Room 4 ["+ getmapusers("06guild_04") +"]"); warp "06guild_0"+ .@room, 0,0; end; case 2: clear; mes "[^EFCC00 DB Room Manager ^000000]"; if ( getvariableofnpc( .rentcost, "DB Room Helper" ) ) mes "The cost to rent a room for "+ getvariableofnpc( .timeout, "DB Room Helper" ) +" minutes is "+ callfunc("F_InsertComma", getvariableofnpc( .rentcost, "DB Room Helper" ) ) +"z."; else mes "You can only use the room for only "+ getvariableofnpc( .timeout, "DB Room Helper" ) +" minutes."; mes " "; .@menu$ = ""; for ( .@i = 5; .@i <= 8; .@i++ ) { if ( getvariableofnpc( .renttime[.@i], "DB Room Helper" ) ) { //mes "Room #"+ .@i +" = "+ .color$[ .type[.@i] ] + .whoinuse$[.@i] +"^000000"; .@menu$ += "Enter Room " + .@i + " ["+ .color$[ .type[.@i] ] + .whoinuse$[.@i] +"^000000]:"; } else .@menu$ += "Rent Room " + .@i + ":"; } next; .@room = select(.@menu$)+4; if ( getvariableofnpc( .renttime[.@room], "DB Room Helper" ) ) { if ( .inuseid[.@room] == getcharid( .type[.@room] ) ) { warp "06guild_0"+ .@room, 0,0; close; } else { mes "[^EFCC00 DB Room Manager ^000000]"; mes "This room is reserved for "; mes .color$[ .type[.@room] ] + .whoinuse$[.@room] +"^000000."; mes "Please select another."; close; } } mes "[^EFCC00 DB Room Manager ^000000]"; mes "Reserve this room for..."; next; .@type = select( "For my party members", "For my guild members", "For personal account use" ); if ( !getcharid(.@type) ) { mes "[^EFCC00 DB Room Manager ^000000]"; mes "You do not own a "+( ( .@type == 1 )? "Party" : "Guild" )+"."; close; } else if ( Zeny < getvariableofnpc( .rentcost, "DB Room Helper" ) ) { mes "You don't have enough zeny to rent a room."; close; } else if ( getvariableofnpc( .renttime[.@room], "DB Room Helper" ) ) { mes "[^EFCC00 DB Room Manager ^000000]"; mes "I'm sorry, somebody else has already registered this room faster than you."; close; } for ( .@i = 1; .@i <= 8; .@i++ ) { if ( ( getvariableofnpc( .renttime[.@i], "DB Room Helper" ) ) && .@type == .type[.@i] && getcharid(.@type) == .inuseid[.@i] ) { mes "[^EFCC00 DB Room Manager ^000000]"; mes "You already rented Room#"+ .@i +". Use that room instead."; close; } } set .type[.@room], .@type; set .inuseid[.@room], getcharid(.@type); set .whoinuse$[.@room], strcharinfo( ( .@type == 3 )? 0 : .@type ); Zeny -= getvariableofnpc( .rentcost, "DB Room Helper" ); warp "06guild_0"+ .@room, 0,0; killmonsterall "06guild_0"+ .@room; donpcevent "Private DB Room Helper#"+ .@room +"::OnEnterMap"; close; case 3: close2; callshop "DB_Room#branch", 1; end; case 4: close; } OnInit: .color$[1] = "^EE8800"; // party color .color$[2] = "^70CC11"; // guild color .color$[3] = "^0000FF"; // account color end; } - script DB Room Helper -1,{ if (.renttime[ atoi( strnpcinfo(2) ) ]) npctalk "Time left: " + callfunc( "Time2Str", .renttime[ atoi( strnpcinfo(2) ) ] + .timeout * 60 ),strnpcinfo(0),bc_self; switch ( select(.menu$ + "Leave this room:" + (compare(strnpcinfo(1),"Private")?"Give up this room":"") ) ) { case 1: if ( mobcount( "this","" ) ) { npctalk "I cannot offer heal service when there are monsters around.",strnpcinfo(0),bc_self; end; } sc_end SC_STONE; sc_end SC_SLOWDOWN; sc_end SC_FREEZE; sc_end SC_SLEEP; sc_end SC_CURSE; sc_end SC_SILENCE; sc_end SC_CONFUSION; sc_end SC_BLIND; sc_end SC_BLEEDING; sc_end SC_DECREASEAGI; sc_end SC_POISON; sc_end SC_HALLUCINATION; sc_end SC_STRIPWEAPON; sc_end SC_STRIPARMOR; sc_end SC_STRIPHELM; sc_end SC_STRIPSHIELD; sc_end SC_CHANGEUNDEAD; sc_end SC_ORCISH; sc_end SC_BERSERK; sc_end SC_SKE; sc_end SC_SWOO; sc_end SC_SKA; percentheal 100,100; specialeffect2 EF_HEAL; npctalk "You are completely healed.",strnpcinfo(0),bc_self; end; case 2: npctalk "Are you sure you want to leave this room?",strnpcinfo(0),bc_self; if ( select( "No, stay here","Yes, leave now") == 2 ) warp .respawnmap$, .respawnx, .respawny; end; case 3: if ( getmapusers( strcharinfo(3) ) > 1 ) { npctalk "There are still some players in this room. Make sure you are the last member in this room to use this option.",strnpcinfo(0),bc_self; end; } mes "[DB Room Helper]"; mes "Are you sure you want to give up this room?"; if ( .rentcost ) mes "You will need to pay again to enter this room."; next; if ( select( "Yes", "No" ) == 2 ) close; awake strnpcinfo(0); end; } close; OnEnterMap: .@id = atoi( strnpcinfo(2) ); .renttime[.@id] = gettimetick(2); sleep .timeout * 60000; mapwarp strnpcinfo(4), .respawnmap$, .respawnx, .respawny; .renttime[.@id] = 0; killmonsterall strnpcinfo(4); end; OnInit: if ( !getstrlen( strnpcinfo(2) ) ) { // Config --------------------------------------------------------------------------------------- // Room rental time, in minutes. // When time runs out, all players inside the room will be kicked out. // Do NOT set this to zero! .timeout = 60; .rentcost = 100000; // Zeny cost for renting a room (0 = free) // Options setting inside the room .@menu[1] = 1; // Turn Heal option On/Off // Respawn point when players leave the room set .respawnmap$, "prontera"; set .respawnx, 150; set .respawny, 174; // Config Ends ------------------------------------------------------------------------ if ( !.timeout ) set .timeout, 60; .menu$ = ( .@menu[1] ? "Heal" : "" ) +":" ; } else { mapannounce strnpcinfo(4), "An administrator has refreshed the server. Please re-register this room.", bc_map; mapwarp strnpcinfo(4), .respawnmap$, .respawnx, .respawny; } end; } - shop DB_Room#branch -1,604:100000,12103:10000000 06guild_01,49,49,4 duplicate(DB Room Helper) DB Room Helper#1 4_F_RUSGREEN 06guild_02,49,49,4 duplicate(DB Room Helper) DB Room Helper#2 4_F_RUSGREEN 06guild_03,49,49,4 duplicate(DB Room Helper) DB Room Helper#3 4_F_RUSGREEN 06guild_04,49,49,4 duplicate(DB Room Helper) DB Room Helper#4 4_F_RUSGREEN 06guild_05,49,49,4 duplicate(DB Room Helper) Private DB Room Helper#5 4_F_RUSGREEN 06guild_06,49,49,4 duplicate(DB Room Helper) Private DB Room Helper#6 4_F_RUSGREEN 06guild_07,49,49,4 duplicate(DB Room Helper) Private DB Room Helper#7 4_F_RUSGREEN 06guild_08,49,49,4 duplicate(DB Room Helper) Private DB Room Helper#8 4_F_RUSGREEN 06guild_01 mapflag nowarpto 06guild_02 mapflag nowarpto 06guild_03 mapflag nowarpto 06guild_04 mapflag nowarpto 06guild_05 mapflag nowarpto 06guild_06 mapflag nowarpto 06guild_07 mapflag nowarpto 06guild_08 mapflag nowarpto 06guild_01 mapflag nomemo 06guild_02 mapflag nomemo 06guild_03 mapflag nomemo 06guild_04 mapflag nomemo 06guild_05 mapflag nomemo 06guild_06 mapflag nomemo 06guild_07 mapflag nomemo 06guild_08 mapflag nomemo 06guild_01 mapflag noteleport 06guild_02 mapflag noteleport 06guild_03 mapflag noteleport 06guild_04 mapflag noteleport 06guild_05 mapflag noteleport 06guild_06 mapflag noteleport 06guild_07 mapflag noteleport 06guild_08 mapflag noteleport 06guild_01 mapflag nosave SavePoint 06guild_02 mapflag nosave SavePoint 06guild_03 mapflag nosave SavePoint 06guild_04 mapflag nosave SavePoint 06guild_05 mapflag nosave SavePoint 06guild_06 mapflag nosave SavePoint 06guild_07 mapflag nosave SavePoint 06guild_08 mapflag nosave SavePoint 06guild_01 mapflag nopenalty 06guild_02 mapflag nopenalty 06guild_03 mapflag nopenalty 06guild_04 mapflag nopenalty 06guild_05 mapflag nopenalty 06guild_06 mapflag nopenalty 06guild_07 mapflag nopenalty 06guild_08 mapflag nopenalty
    1 point
  22. https://github.com/rathena/rathena/blob/master/db/re/skill_tree.yml or https://github.com/rathena/rathena/blob/master/db/pre-re/skill_tree.yml
    1 point
  23. No sé por qué, pero a veces tenía que dar más permisos a la dirección IP 127.0.0.1 en PHPmyadmin por razones inexplicables, aunque es lo mismo que localhost. Sin embargo, si has desactivado que se pueda acceder al puerto 3306 desde fuera y solo localmente, entonces puedes elegir "any" como host para el usuario. Aun así, recomiendo bloquear el acceso al puerto 3306 desde el exterior a través del firewall (por ejemplo, ufw). Rynbef~
    1 point
  24. 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
  25. Flux CP Addons, Crypto Payments Gateway Installation 1. Open addons and add into your addons folder. 2. Upload database.sql to your MySQL database 3. Copy folder "lib" to your "lib" folder in Ragnarok FLUX CP 4. Register account at xPayapi https://xpayapi.com/ 5. Create new merchant 6. Set up merchant. - Title => Merchant Title - Domain => Your Flux CP domain - URL notifications about the payment of the invoice => https://yourdomain.com/ ?module=crypto&action=notify - URL Pages with a message about successful payment => https://yourdomain.com/ ?module=crypto&action=process - URL Pages with a failure message when paying => https://yourdomain.com/ ?module=crypto&action=cancel 7. Access link https://your.site.com/?module=donatecrypto 8. Done, Test it! If still cannot access, just copy "addons > crypto > themes > default > crypto (this folder)" to your Themes Folder Download here
    1 point
  26. - We added Shiba BEP20 Token to payments gateway If you have any inquiries, please let us know
    1 point
  27. 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
  28. Hey Leute, als neuer deutscher und englischer Forum Moderator freue ich mich, den deutschen Bereich auch wieder etwas Regelkonformer zu gestalten. Bitte schreibt ausschließlich auf Deutsch in den Topics/ Posts und Titel. Ihr könnt noch die Englische Sprache hinzufügen, aber dafür gibt es die Englischen Sections. Ich würde mich interessieren, wer noch alles da ist, aus der kleinen deutschen Community. Schreibt doch gerne mal was. Und ich bin hier, um euch zu helfen Rynbef~
    1 point
  29. Oh nice! I'm glad you were able to resolve it.
    1 point
  30. 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
  31. Just Init an NPC Timer that trigger a label. https://github.com/rathena/rathena/blob/26335994588c4b45846c05d0e53780ead78e475c/doc/script_commands.txt#L7169 Rynbef~
    1 point
  32. 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
  33. This is still working since I add to to my local server few days ago. A "solution" found for the window not being closed, is to run clif_refresh which does same than @refresh I tried many ways but nothing worked, just that..
    1 point
  34. thanks, already test it, now the error warning not showing in map server.
    1 point
  35. Hello, no, but has been merged in https://x-files.amirazman.my/customfilegenerator. I hope you can access it there.
    1 point
  36. View File Upscaled npc sprites Please note that you can download the full version of the sprite set from this link. The file is large and cannot be uploaded to the forum. You can download my sprites rework [FOR FREE] and not for resale! [DOWNLOAD] https://mega.nz/file/taQwkKwL#ikVnLwKyX52rymVMlaAqxFMd8YHsC2itTyk3GxmAjtc Submitter Balfear Submitted 09/20/23 Category NPC Sprites Video https://youtu.be/gt8JM0Y5pwM Content Author Gravity / Balfear  
    1 point
  37. Hmm, you'd definitely want to add more checks on this, but here: - script Mob Helper -1,{ OnNPCKillEvent: // Fixed improper usage of rand for "chance" if (500 < rand(10000)) end; if (mkTimed && gettimetick(2) <= mkTimed) end; // Don't use "set" anymore, that's way outdated. // Using getmonsterinfo isn't a bad idea, but it's somewhat useless/broken now. You'd have to expand on it in the source to make it useful. getunitdata(killedgid, .@mobdata); // There's no reason to use player variables in this case, the variable has no purpose outside of the NPC block code. Therefore it should be a NPC variable. .@MobMode = .@mobdata[UMOB_MODE]; .@MobClass = .@mobdata[UMOB_CLASS]; if (!(.@MobMode & MD_CANMOVE)) end; if (!(.@MobMode & MD_CANATTACK)) end; // MD_BOSS/32 isn't a thing anymore either, so that code won't work. if (.@MobClass == CLASS_BOSS) end; // Too much wrong with these lines. //set @WoE[0],1288|1285|1830|1949|1950|1286|1287|1899|1829; //WoE IDs //for(set @n,0; @n < getarraysize(@WoE); set @n,@n+1){ if(@WoE[@n] == killedrid){ end; } } //WoE // You probably meant to use "setarray", and you also probably to use commas instead of separators: setarray @woe, 1288, 1285, ..; // Either way, that's inefficient considering this code runs on all killed monsters. Honestly I'd do the whole thing via the source instead since running a script everytime you kill a monster is overkill. Anyhow, use a dictionary seach: if (.badMob[killedrid]) end; .@nTime = (300 + rand(0, 120)) - getmonsterinfo(killedrid, MOB_LV); // The main reason why your script didn't work: "summon" uses miliseconds, not seconds. .@nTime *= 1000; // s to ms summon "Ajudante " + getmonsterinfo(killedrid, MOB_NAME), killedrid, .@nTime; mkTimed = gettimetick(2) + .@nTime + rand(0, 60); message strcharinfo(0), "[" + getmonsterinfo(killedrid, MOB_NAME) + "] Hello " + strcharinfo(0) + " I will help you for a few minutes!"; end; OnInit: // Define bad mobs here .badMob[1288] = 1; .badMob[1285] = 1; .badMob[1830] = 1; .badMob[1949] = 1; .badMob[1950] = 1; .badMob[1286] = 1; .badMob[1287] = 1; .badMob[1899] = 1; .badMob[1829] = 1; end; }
    1 point
  38. Well, what I posted was an example for you to modify yourself to fit your needs. If you want to be able to only mark one specific mob on a map by mob id you can do it like this: - script MOB_MARKER -1,{ OnInit: bindatcmd("markmobs", strnpcinfo(3) + "::OnMarkMobs"); bindatcmd("unmarkmobs", strnpcinfo(3) + "::OnUnmarkMobs"); end; function delete_viewpoints { freeloop(1); for(.@i = 0; .@i < getarraysize(@viewpoints_x); .@i++) { viewpoint(2, @viewpoints_x[.@i], @viewpoints_y[.@i], (.@i + 1), 0xFF0000); } freeloop(0); deletearray(@viewpoints_x, getarraysize(@viewpoints_x)); deletearray(@viewpoints_y, getarraysize(@viewpoints_y)); } OnMarkMobs: if(.@atcmd_numparameters != 1) { dispbottom("Usage: @markmobs MobID"); end; } .@mob_id = atoi(.@atcmd_parameters$[0]); if((.@mob_name$ = strmobinfo(1, .@mob_id)) == "") { dispbottom("A mob with the Mob ID " + .@mob_id + " does not exist."); end; } getmapxy(.@map$, .@x, .@y); getmapunits(BL_MOB, .@map$, .@mobs); if(getarraysize(.@mobs) == 0) { dispbottom("There are no mobs on this map."); end; } if(getarraysize(@viewpoints_x) > 0) { delete_viewpoints(); } freeloop(1); for(.@i = 0; .@i < getarraysize(.@mobs); .@i++) { if(getunitname(.@mobs[.@i]) != .@mob_name$) { continue; } getunitdata(.@mobs[.@i], .@unit_data); .@viewpoint_index = getarraysize(@viewpoints_x); viewpoint(1, .@unit_data[UMOB_X], .@unit_data[UMOB_Y], (.@viewpoint_index + 1), 0xFF0000); @viewpoints_x[.@viewpoint_index] = .@unit_data[UMOB_X]; @viewpoints_y[.@viewpoint_index] = .@unit_data[UMOB_Y]; } freeloop(0); if(getarraysize(@viewpoints_x) == 0) { dispbottom("Mob ID " + .@mob_id + " was not found on the map."); end; } end; OnUnmarkMobs: if(getarraysize(@viewpoints_x) == 0) end; delete_viewpoints(); }
    1 point
  39. I didn't test it so there might be slight typos or small bugs, but basically you can do it like this: - script MOB_MARKER -1,{ OnInit: .map$ = "yourmap"; bindatcmd("markmobs", strnpcinfo(3) + "::OnMarkMobs"); bindatcmd("unmarkmobs", strnpcinfo(3) + "::OnUnmarkMobs"); end; function unmark_mobs { freeloop(1); for(.@i = 0; .@i < getarraysize(.@viewpoints_x); .@i++) { viewpoint(2, @viewpoints_x[.@i], @viewpoints_y[.@i], (.@i + 1), 0xFF0000); } freeloop(0); deletearray(@viewpoints_x, getarraysize(@viewpoints_x)); deletearray(@viewpoints_y, getarraysize(@viewpoints_y)); return; } OnMarkMobs: if(getarraysize(@viewpoints_x) > 0) { unmark_mobs(); } getmapunits(BL_MOB, .map$, .@mobs); freeloop(1); for(.@i=0; .@i < getarraysize(.@mobs); .@i++) { getunitdata(.@mobs[.@i], .@unit_data); viewpoint(1, .@unit_data[UMOB_X], .@unit_data[UMOB_Y], (.@i + 1), 0xFF0000); @viewpoints_x[.@i] = .@unit_data[UMOB_X]; @viewpoints_y[.@i] = .@unit_data[UMOB_Y]; } freeloop(0); end; OnUnmarkMobs: if(getarraysize(@viewpoints_x) > 0) { unmark_mobs(); } }
    1 point
  40. This only 1-200 base level, how i can make calculation to base 500? BaseExp: - Level: 1 Exp: 600 - Level: 2 Exp: 1080 - Level: 3 Exp: 1800 - Level: 4 Exp: 2640 - Level: 5 Exp: 3840 - Level: 6 Exp: 4560 - Level: 7 Exp: 5040 - Level: 8 Exp: 5460 - Level: 9 Exp: 6000 - Level: 10 Exp: 6600 - Level: 11 Exp: 7200 - Level: 12 Exp: 7320 - Level: 13 Exp: 7620 - Level: 14 Exp: 8040 - Level: 15 Exp: 8820 - Level: 16 Exp: 9600 - Level: 17 Exp: 10080 - Level: 18 Exp: 10560 - Level: 19 Exp: 11040 - Level: 20 Exp: 12610 - Level: 21 Exp: 13390 - Level: 22 Exp: 14300 - Level: 23 Exp: 15340 - Level: 24 Exp: 16900 - Level: 25 Exp: 18460 - Level: 26 Exp: 19500 - Level: 27 Exp: 20800 - Level: 28 Exp: 22100 - Level: 29 Exp: 23400 - Level: 30 Exp: 24700 - Level: 31 Exp: 26000 - Level: 32 Exp: 27300 - Level: 33 Exp: 28600 - Level: 34 Exp: 30160 - Level: 35 Exp: 31200 - Level: 36 Exp: 33800 - Level: 37 Exp: 35750 - Level: 38 Exp: 37700 - Level: 39 Exp: 39000 - Level: 40 Exp: 44100 - Level: 41 Exp: 46200 - Level: 42 Exp: 47600 - Level: 43 Exp: 50400 - Level: 44 Exp: 52500 - Level: 45 Exp: 53200 - Level: 46 Exp: 56000 - Level: 47 Exp: 58800 - Level: 48 Exp: 62300 - Level: 49 Exp: 65800 - Level: 50 Exp: 68600 - Level: 51 Exp: 71400 - Level: 52 Exp: 74200 - Level: 53 Exp: 77000 - Level: 54 Exp: 79800 - Level: 55 Exp: 82600 - Level: 56 Exp: 86100 - Level: 57 Exp: 88200 - Level: 58 Exp: 91000 - Level: 59 Exp: 93800 - Level: 60 Exp: 103500 - Level: 61 Exp: 105000 - Level: 62 Exp: 109500 - Level: 63 Exp: 115500 - Level: 64 Exp: 120000 - Level: 65 Exp: 126000 - Level: 66 Exp: 132000 - Level: 67 Exp: 136500 - Level: 68 Exp: 142500 - Level: 69 Exp: 165000 - Level: 70 Exp: 192000 - Level: 71 Exp: 210000 - Level: 72 Exp: 232500 - Level: 73 Exp: 244500 - Level: 74 Exp: 255000 - Level: 75 Exp: 270000 - Level: 76 Exp: 282000 - Level: 77 Exp: 292500 - Level: 78 Exp: 300000 - Level: 79 Exp: 345000 - Level: 80 Exp: 416000 - Level: 81 Exp: 480000 - Level: 82 Exp: 560000 - Level: 83 Exp: 640000 - Level: 84 Exp: 768000 - Level: 85 Exp: 880000 - Level: 86 Exp: 960000 - Level: 87 Exp: 1088000 - Level: 88 Exp: 1200000 - Level: 89 Exp: 1440000 - Level: 90 Exp: 1700000 - Level: 91 Exp: 2040000 - Level: 92 Exp: 2550000 - Level: 93 Exp: 3060000 - Level: 94 Exp: 3570000 - Level: 95 Exp: 4080000 - Level: 96 Exp: 4760000 - Level: 97 Exp: 5610000 - Level: 98 Exp: 6800000 - Level: 99 Exp: 1272747 - Level: 100 Exp: 1354202 - Level: 101 Exp: 1440870 - Level: 102 Exp: 1533085 - Level: 103 Exp: 1631202 - Level: 104 Exp: 1735598 - Level: 105 Exp: 1846676 - Level: 106 Exp: 1964863 - Level: 107 Exp: 2090614 - Level: 108 Exp: 2224413 - Level: 109 Exp: 2366775 - Level: 110 Exp: 2518248 - Level: 111 Exp: 2679415 - Level: 112 Exp: 2850897 - Level: 113 Exp: 3033354 - Level: 114 Exp: 3227488 - Level: 115 Exp: 3434047 - Level: 116 Exp: 3653826 - Level: 117 Exp: 3887670 - Level: 118 Exp: 4136480 - Level: 119 Exp: 4401214 - Level: 120 Exp: 4755467 - Level: 121 Exp: 5138234 - Level: 122 Exp: 5551810 - Level: 123 Exp: 5998675 - Level: 124 Exp: 6481508 - Level: 125 Exp: 7003204 - Level: 126 Exp: 7566891 - Level: 127 Exp: 8175950 - Level: 128 Exp: 8834032 - Level: 129 Exp: 9545083 - Level: 130 Exp: 10313366 - Level: 131 Exp: 11143488 - Level: 132 Exp: 12040427 - Level: 133 Exp: 13009560 - Level: 134 Exp: 14056699 - Level: 135 Exp: 15188122 - Level: 136 Exp: 16410613 - Level: 137 Exp: 17731503 - Level: 138 Exp: 19158711 - Level: 139 Exp: 20700795 - Level: 140 Exp: 22367001 - Level: 141 Exp: 24167320 - Level: 142 Exp: 26112547 - Level: 143 Exp: 28214345 - Level: 144 Exp: 30485317 - Level: 145 Exp: 32939080 - Level: 146 Exp: 35590346 - Level: 147 Exp: 38455012 - Level: 148 Exp: 41550255 - Level: 149 Exp: 44894635 - Level: 150 Exp: 48508204 - Level: 151 Exp: 52412629 - Level: 152 Exp: 56631321 - Level: 153 Exp: 61189576 - Level: 154 Exp: 66114724 - Level: 155 Exp: 71436298 - Level: 156 Exp: 77186205 - Level: 157 Exp: 83398922 - Level: 158 Exp: 90111701 - Level: 159 Exp: 97364791 - Level: 160 Exp: 105201683 - Level: 161 Exp: 113669366 - Level: 162 Exp: 122818613 - Level: 163 Exp: 132704283 - Level: 164 Exp: 143385650 - Level: 165 Exp: 154926760 - Level: 166 Exp: 167396814 - Level: 167 Exp: 180870583 - Level: 168 Exp: 195428856 - Level: 169 Exp: 211158924 - Level: 170 Exp: 229155105 - Level: 171 Exp: 246519309 - Level: 172 Exp: 266361648 - Level: 173 Exp: 287801097 - Level: 174 Exp: 310966207 - Level: 175 Exp: 352013746 - Level: 176 Exp: 398479560 - Level: 177 Exp: 451078861 - Level: 178 Exp: 510621270 - Level: 179 Exp: 578023277 - Level: 180 Exp: 654322349 - Level: 181 Exp: 740692899 - Level: 182 Exp: 838464361 - Level: 183 Exp: 949141656 - Level: 184 Exp: 1074428354 - Level: 185 Exp: 1216252896 - Level: 186 Exp: 1376798278 - Level: 187 Exp: 1558535650 - Level: 188 Exp: 1764262355 - Level: 189 Exp: 1997144985 - Level: 190 Exp: 2260768123 - Level: 191 Exp: 2559189515 - Level: 192 Exp: 2897002530 - Level: 193 Exp: 3279406863 - Level: 194 Exp: 3712288568 - Level: 195 Exp: 4202310658 - Level: 196 Exp: 4757015664 - Level: 197 Exp: 5384941731 - Level: 198 Exp: 6095754039 - Level: 199 Exp: 6900363572 - Level: 200 Exp: 9999999999
    1 point
  41. There's a few generators stated there, but I didn't add armors or accessories since mostly this just need itemdb and iteminfo.lua only (including the sprites that you need to make sure it is exist) and rarely people add this. But maybe I'll add for it soon. About the source code, I think the website will be up for a quite long time since I've been using the domain for years and I'm planning to actively using it in the future. Anything happens, I'll release the source code later on. I've been thinking about this too before to add or run it easily so that FluxCP can have the items in the database. Maybe later on. Btw thanks for the suggestion.
    1 point
  42. 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
  43. Before I saw a few of servers having issue because of groups.yml that written incorrectly, which can makes server couldnt start (stuck at reading groups.yml), or account cannot login because of group ID didnt exist (cant be read by rathena emulator). So I hope this helps, Commands Generator. The list of commands are parsed directly from doc/atcommands.txt so if there is any updates of commands, it should be automatically added too. Let me know if you have any suggestion or improvement ideas for any of this generator.
    1 point
  44. Hi Find all lines with getmapxy in the botkiller files and replace the "0"s to BL_PC. Examples: getmapxy .@map$,.@x, .@y, 0; getmapxy .@BKMap$,.@BKX,.@BKY, 0; getmapxy .@map$,.@x,.@y, 0,@playername$; To: getmapxy .@map$,.@x, .@y, BL_PC; getmapxy .@BKMap$,.@BKX,.@BKY, BL_PC; getmapxy .@map$,.@x,.@y, BL_PC,@playername$;
    1 point
  45. 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
  46. E - Script Collection Last Update : September 10, 2013 Refine Function SQL Mission Board Monster Marching Vendor Control Advanced Stylist Coin Exchanger Doppelganger Race Of The Day Limited Items Multi Currency Shop Random News GM Online List Link Broken E-Inquiry DotA Runes Flower Counting Game Class Restriction Chain Quest Build Manager Misc Scripts : Freebies Script Card Trader Gold Room [ Pick Gold ] Gold Room [ Guild Tax ] Map Restriction [ GM Based ] Daily Reward Monthly Reward Monster Spawner Monster Summoner with Last Summoned Display Players Stats & Equipments 3rd Job Item Giver Exchanger [ Cashpoint to Coins ] Exchanger [ Poring Coin - Zeny ] Exchanger [ Points to Tickets ] Exchanger [ Item to Item ] Exchanger [ Item to Item ] Exchanger [ Multi Item to 1 Item ] Party Match Auto Ban Over Stats Users Soul Link Buff Kill Players gain Cash Points Party Members All Get Items [ Snippet ] Message Board Stalker Class Skill Reproduce NPC Multiple Selection Quest [ Template ] In-Game Item Rewarder In-Game Points Rewarder Invasion Event Custom Item Rate Status Point Seller [ Snippet ] Anti Bot Security Script Anti Bot Script [ Code / Question ] Item Combo Restriction [ LHZ Card ] Drop Item Upon Death PVP Switcher + Announcer [ Guild Master ] Rotating Waitingroom Messages +10 Refiner [ Specific Items ] Random Rate Item Exchanger MVP Invasion Premium Users [ Boost Rates ] Display Cutin Image upon Login Custom Randomed Box Items Kick GM during WOE Custom Crafting NPC Restrict Same IP [ Certain Map ] Coloured Items Exchanger Guild Master Changer Party Team PK Match Gambling Game IRC Channel Crafting NPC Guild Storage Restriction Stage Game [ Version 4 ] Monster Wiki Event [ Version 3 ] Special Thank you for my Tutor : Notes : I am a bit lazy to write all those Script Descriptions, i do believe that all of you able to get how this script works. Anyway, i will still doing my best to write the Updated Changelog or informations about the script as detail as possible. All the Scripts above are uploaded to Pastebin . Abide the Following Rule : Scripts Error / Not Working , you have to Explain it in Details. ( Add in Images / Modified Scripts ) Do not SPAM / BUMP in my Topic. Do not ask for Support stuffs for other Scripts in this Topic. Link Down , then drop [ @Emistry ] a message. I Reserved the Right for NOT Answering your Posts if you did not abide my Topic's Rules. Keep This In Your Mind : All the Scripts i distribute here are NOT FOR COMMERCIAL USES . DO NOT remove my Credits if you are using part of the scripts to modify your own. DO NOT re-release the scripts in any form / way. If you ♥ these Scripts , Click on to Vote this Topic up. Or you may also click on at above the Topic
    1 point
  47. If you don't use the Roulette button, you can use the roulette as the config button, you can also change the roulette icon in your grf. go to src/map/clif.cpp Change void clif_roulette_open( struct map_session_data* sd ){ nullpo_retv( sd ); struct packet_roulette_open_ack p; p.PacketType = 0xa1a; p.Result = 0; // result p.Serial = 0; // serial p.Step = (sd->roulette.claimPrize) ? sd->roulette.stage - 1 : 0; p.Idx = (sd->roulette.claimPrize) ? sd->roulette.prizeIdx : -1; p.AdditionItemID = -1; //! TODO: Display bonus item p.GoldPoint = sd->roulette_point.gold; p.SilverPoint = sd->roulette_point.silver; p.BronzePoint = sd->roulette_point.bronze; sd->state.roulette_open = true; clif_send( &p, sizeof( p ), &sd->bl, SELF ); } to void clif_roulette_open( struct map_session_data* sd ){ nullpo_retv( sd ); npc_event_do_id("NPCNAME::OnLabel", sd->status.account_id); } and make a script like this, for example. - script NPCNAME -1,{ OnLabel: mes "add whatever you want."; end; }
    1 point
  48. https://github.com/rathena/rathena/wiki/scripting https://github.com/rathena/rathena/wiki/Adding-a-Script https://github.com/rathena/rathena/blob/master/doc/script_commands.txt https://github.com/rathena/rathena/tree/master/npc/custom
    1 point
  49. It seemed interesting, so I took a bit of everybody's work and here is my attempt with a novice. ➡ Also, my take on asking for a release. It's basically won't happen, for several reasons : Rendering issue: While the sprites can be used in 3D space (it's simply using UV coordinates, so it's basically free), the UI doesn't support scaling whatsoever; your characters will stay giant in status and skill windows, it's not negotiable. Performances: My novice has height time more pixels than the original sprite and 4 times more colors. I'm sure I could write a tool to reduce the color numbers, but it wouldn't change the fact that crossing through Prontera (or whatever is your capital city) with this kind of sprites would make the vram requirement explode, possibly beyond the 32 bit limitation of the client. And I'm not even talking about the palette system breaking. Reality check: Would you even see it? This is a 1080p screenshot of RO, with my upscaled novice right beside a real in game novice. Can you honestly see the difference? Probably not a first glance. So, beside higher resolution (1440p and 4k, basically) or in a more zoomed in scenario, this doesn't really bring much to the table. It's just a nice exercise to learn a bit about AI upscaling, I spent the whole day learning, and I'm quite satisfied with the result for a total noob.
    1 point
×
×
  • Create New...