Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 11/20/19 in all areas

  1. Hey all! It's been too long, hasn't it? I guess you could say I've been quite busy lately. However the other day I realized wanted to do something for the community once again (because honestly it's been forever since I contributed), hence why I'm here now. But then I wondered, what can I do? Of course there was the possibility of doing a free release, but I've done many of those already in the past. What else? Creating yet another guide how to develop maps in browedit from the ground up? Hm, we already have several amazing ones that effectively cover everything. What if I give you something different? Something - more like a neat little trick - that I've figured out through sheer exploration about two years ago. And what's that, precisely? As the title implies: Mapping through hexing. Over-hauling existing maps, without having to touch browedit. Also- This post might seem long, but rest assured it is super easy. The screenshots simply take up a lot of space. Before we start..... What is hexing? I could go the extra mile and explain it in my own words, but rAthena's GitHub gives an informative description what hexing is. As most of you may know, experts have developed tools with an user-friendly interface to make client hexing - AKA 'diffing' - even easier for us, however what the majority does not know is that hexing isn't specifically limited to .exe modifications and can be applied to many different file extensions- RO map files and models among them. Having that said, I think you have an idea in which direction I'll be heading. Okay, before anything else... I need to state that this method is recommendable to set the base design. You can in theory over-haul your entire map this way, but I highly encourage it to only be done with the repetitive textures and models (such as trees, bushes, buildings). Preferably, your map uses custom textures/models, they're easier to memorize (and thus replace) than the official gibberish components. What are the pros and cons? Pros: Once you get the hang of this, you could save yourself a lot of valuable time and make fresh layouts rapidly. No need to generate (custom textured) models through the build-in browedit RSM editor tool. We'll take a different approach. Gats remain unaltered and models will remain facing the same way. Lastly - probably the main reason what I like about this - texture and model files from your previous design will be preserved and not over-written. New ones are created which are fetched from a different texture/model directory. After implementation the only thing that will be over-written are the map files themselves (which also means less heavy patches). Cons: While you don't have to, you will likely still want to open browedit for some finishing touches. You can easily slip up and corrupt your map with a single typo. Back things up and be focused when you get to step 3! What will we need? GRF Tool (i.e GRF Editor). Hex Editor (i.e XVI32). Image Editing Software (i.e Photoshop). A custom map - seasonal/holiday themed is preferred, but not necessary. Basic ~ moderate client-side & browedit knowledge. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Now, since we've got all that covered... Let's begin! For this guide, we're going to use my Christmas Prontera (screenshot below) map as sample, and turn it into a Spring Prontera (screenshot at the bottom of the post). - Files - We're going to need to locate the map and its contents that we're going to edit. So let's do that, here are the resources... Step #1 - Copying & Renaming What you need to do first, is go back to the main directory and copy the entire 'Christmas Pront' directory. Paste it and rename it - in this case - 'Spring Pront'. If you've done this correctly, you should now have two directories. Spring Pront and Christmas Pront, both containing files of Christmas Pront. Open the 'Spring Pront' folder and begin re-naming all the files that still contain an abbreviation of the Christmas Prontera layout. Keep it simple for yourself. For example, I recommend replacing the 'chr' and make it 'spr', like this: Note: If there's a lot to edit, consider pulling up a notepad and writing down the old texture/model/directory names and the new ones next to it. I'm telling you this, because you're going to need to check back to the old names later. Better safe than sorry. "Why does a snow texture display 'spr_gras?" - I know, it doesn't make sense yet. Disregard, you'll understand in step #2. "Can the abbreviations I choose exceed the amount of characters that the original files use? (i.e spring_grass instead of spr_gras)" - It probably could with additional steps but...Let's not for now, okay? If you've done everything as per tutorial, you will have no texture, model or directory left anymore including 'chr' or 'Christ'. Double-check in order to confirm. Step #2 - The Artsy Stuff Got a graphic artist on your team? Lucky you- because then you can simply skip this (most time-consuming) step and instruct your artist to present you with something appealing. But we're not going to do that, are we? No, we're going to pretend you're a solo developer. Go to google images and look for a square texture that you wish to replace the snow texture with. Since this is a spring themed map, I went with something green and flowery. Admittedly though, I wasn't too fond of the original image I chose because it seemed a little too crowed/clustered(?) and the borders didn't align, so I decided to look for a plain grass image and combine it with the initial flowery tile of my choice. Still a lil clustered but better. Here's the result: Okay so clearly this isn't a Photoshop guide - my Photoshop skills are far from perfect - but I think you get the idea. ;-; Seamless images are the best, however it isn't always possible to find them. Fear not, young grasshopper- You need not be an expert in Photoshop but at the very least try to edit the texture sufficiently (with the eraser tool on the top layer) for the borders to have a relatively smooth over-flow. Needless to say, if flowers are being cut off at the border of a texture, it does not exactly look attractive. Done? Resize the image(s) to 256x256 and save as 24 bit bmp. Do this with all the textures you've redesigned, your texture directory should somewhat look like this: Again, this might take a while if you're doing everything alone and aren't that familiar with Photoshop. Note: spr_tree3~5 are tga files, but they have been adjusted as well. Step #3 - Hex It! This step is the most technical one and you'll need to look back every now and then to your other layout's textures and models - in this case my Christmas Pront - as name replacement reference. Please be aware that you can screw up easily here! Yes, it's easy but you've gotta pay attention! Double check everything you do and make sure you don't typo anything or miss anything out. Map Files Let's do these first. Boot your Hex Editor software and locate 'prontera.gnd' in your 'Spring Prontera' directory. Access the replacement feature, in XVI32's case: Search > Replace... What we're going to do is ensure the .gnd file reads the new textures, alright? We don't want the map files looking for the Christmas Pront textures/models anymore because this isn't going to be a Christmas Pront. ? Replaced them all? Great. Do the exact same for the models with the .rsw file: 158 entries. Pretty sweet, right? Model Files We're almost done! The last step will be hexing the models. Open them 1 by 1 in your Hex Editor software like you did with the map files and adjust the entries accordingly so the models are no longer searching for the incorrect texture files. Like this... And that's.... basically it. To see if you err'd anywhere, just open GRF Editor and put all the resources into it. If done correctly you'll see that your map and model files have adapted to your edits made through hexing. What was previously snow-covered, now returns something else entirely. Take this lovely flowery tree for example... ? Some of you may wonder- "How is this different than just regular (existent) texture replacement/recoloring? The answer is, exactly that. You're not replacing or changing the original texture/model resources at all. Quite the contrary- You're preserving your previous theme, all while generating an entire new theme with separate contents and directories that are being read. Convenient to server owners, too. No more messing around with different texture and model directories, worrying about if you might've missed something out when adding/removing files with the patcher. Using this methods, when the time comes where you want/need to switch theme, simply patch in the new map files (prontera.rsw and prontera.gnd) and you're good to go (unless if you've made gat edits of course- in which case you'll need to add the prontera.gat as well!). Needless to say, for the first-time implementation, you do need to include all the texture/model components. But that's obvious. And now, the final result? This is how Prontera will look like~ We went from winter wonderland to a refreshing and colorful spring design~ Fair enough- you'll still see the occasional wintry lantern, and the center higher up still has a giant pine tree, fine. Light-maps intensity need to be re-considered, too. But for the most part? Your map is about 3/4 done. What's left is just the small details that will likely only take you an hour or two at most to wrap up. ? Well, I hope this makes the life easier for some of you! ♥
    7 points
  2. Version 2.0.1

    900 downloads

    UPDATE: version 1 = I removed all my modifications on this script version 2 = Has timers and will most likely be in-conflict with other event scripts i made. Here is my take on a LMS Event. Just a simple one. Runs hourly or Manually run by a GM Reward can be set Enjoy. UPDATE 2.0: Changed to a new version that works like my other script events. ? Still runs hourly and manually run by a gm.
    Free
    1 point
  3. @gidzdlcrz try this //===== eAthena Script ======================================= //= Poring Event //===== By: ================================================== //= Wild Karrd, alexx //===== Current Version: ===================================== //= 3.0 //===== Compatible With: ===================================== //= eAthena 12426 //===== Description: ========================================= //= Find correct poring Event //===== Additional Comments: ================================= //= 3.0 Bug fixed and totaly modified [alexx] //============================================================ - script poring_event_on -1,{ OnMinute00: enablenpc "Poring Catcher"; announce "It's time to catch Porings!",bc_all; set $@EventEnd,0; set $@Wrong,-3; sleep ( 60 * 60000 ); // How long before hide again if ($@EventEnd == 0) { disablenpc "Poring Catcher"; announce "You're late. Catch Porings event is over...",bc_all,0xF49AC1; set $@EventEnd,1; } end; } prontera,156,126,4 script Poring Catcher 909,{ OnTouch: mes "[^2E3192Poring Catcher^000000]"; mes "Hellooo, "+strcharinfo(0)+"! I like to catch porings very much. It's fun!"; next; menu "I wanna too!",L_check,"Tell me more?",L_info,"I'm leaving... Bye.",L_bye; close; Check1: mes "Please Enter The Code Below To Prove That You Are Human:"; mes "^0000FF081808^000000"; input .@pass$; if (.@pass$ == "081808") goto Confirm; mes "It seems you input the wrong code, Please try again"; set @Wrong,1; close; Check2: mes "Please Enter The Code Below To Prove That You Are Human:"; mes "^0000FF070786^000000"; input .@pass$; if (.@pass$ == "070786") goto Confirm; mes "It seems you input the wrong code, Please try again"; set @Wrong,1; close; Check3: mes "Please Enter The Code Below To Prove That You Are Human:"; mes "^0000FF081887^000000"; input .@pass$; if (.@pass$ == "070786") goto Confirm; mes "It seems you input the wrong code, Please try again"; set @Wrong,1; close; Check4: mes "Please Enter The Code Below To Prove That You Are Human:"; mes "^0000FF0102350^000000"; input .@pass$; if (.@pass$ == "102350") goto Confirm; mes "It seems you input the wrong code, Please try again"; set @Wrong,1; close; Check5: mes "Please Enter The Code Below To Prove That You Are Human:"; mes "^0000FFsjrh^000000"; input .@pass$; if (.@pass$ == "sjrh") goto Confirm; mes "It seems you input the wrong code, Please try again"; set @Wrong,1; close; Check6: mes "Please Enter The Code Below To Prove That You Are Human:"; mes "^0000FFtgd4^000000"; input .@pass$; if (.@pass$ == "tgd4") goto Confirm; mes "It seems you input the wrong code, Please try again"; set @Wrong,1; close; Check7: mes "Please Enter The Code Below To Prove That You Are Human:"; mes "^0000FF678e^000000"; input .@pass$; if (.@pass$ == "678e") goto Confirm; mes "It seems you input the wrong code, Please try again"; set @Wrong,1; close; Check8: mes "Please Enter The Code Below To Prove That You Are Human:"; mes "^0000FFegf3^000000"; input .@pass$; if (.@pass$ == "egf3") goto Confirm; mes "It seems you input the wrong code, Please try again"; set @Wrong,1; close; Check9: mes "Please Enter The Code Below To Prove That You Are Human:"; mes "^0000FF76he^000000"; input .@pass$; if (.@pass$ == "76he") goto Confirm; mes "It seems you input the wrong code, Please try again"; set @Wrong,1; close; Check10: mes "Please Enter The Code Below To Prove That You Are Human:"; mes "^0000FF59ej^000000"; input .@pass$; if (.@pass$ == "59ej") goto Confirm; mes "It seems you input the wrong code, Please try again"; set @Wrong,1; close; L_check: mes "[^2E3192Poring Catcher^000000]"; mes "I'm sorry but before you enter, You must prove to me that you are human..."; next; set @rand,rand(1,10); if ( @rand == 1 ) goto Check1; if ( @rand == 2 ) goto Check2; if ( @rand == 3 ) goto Check3; if ( @rand == 4 ) goto Check4; if ( @rand == 5 ) goto Check5; if ( @rand == 6 ) goto Check6; if ( @rand == 7 ) goto Check7; if ( @rand == 8 ) goto Check8; if ( @rand == 9 ) goto Check9; if ( @rand == 10 ) goto Check10; end; Confirm: next; mes "[^2E3192Poring Catcher^000000]"; mes "Have fun!"; next; if ($@EventEnd == 1) { atcommand "@broadcast Hi I'm a Poring catcher Bugger, Report me to a GM please"; warp "SavePoint",0,0; } else { if ($@PoringsSummoned == 0) { initnpctimer; donpcevent "Poringsummoner::OnSummon"; set $@PoringsSummoned,1; } warp "poring_w01",100,100; end; } OnTimer600000: stopnpctimer; disablenpc "Poring Catcher"; killmonster "poring_w01","All"; set $@PoringsSummoned,0; mapwarp "poring_w01","prontera",137,234; announce "You're late. Catch Porings event is over...",bc_all,0xF49AC1; warp "SavePoint",0,0; set $@EventEnd,1; end; L_info: mes "[^2E3192Poring Catcher^000000]"; mes "There are 100 different porings at the field."; mes "But only one of them is real, you have to find him."; mes "You will be rewarded with the coin and some present if be lucky."; mes "Goood luuck!"; close; L_coin: callsub S_BonusReward; end; L_bug: atcommand "@broadcast Hi I'm a Poring catcher Bugger, Report me to a GM please"; atcommand "@broadcast Hi I'm a Poring catcher Bugger, Report me to a GM please"; close; L_bye: mes "[^2E3192Poring Catcher^000000]"; mes "Bye-bye!"; close; OnInit: disablenpc "Poring Catcher"; set $@PoringsSummoned,0; end; OnWarp: initnpctimer; enablenpc "Poring Catcher"; donpcevent "Poringsummoner::OnSummon"; end; N_Shop: mes "[^2E3192Poring Catcher^000000]"; mes "That do you want to exchenge your coins on?"; next; menu "Exchange on headgears",-,"Nothing",N_NVM; mes "[^2E3192Poring Catcher^000000]"; mes "Headgears? Here is all i have..."; next; menu "^000090Guild Recruiting Hat^000000 - 50PC",-, "^000090Party Hat^000000 - 50PC",N_Hat2, "^000090Boyfriend Hat^000000 - 50PC",N_Hat3, "^000090Friend Hat^000000 - 50PC",N_Hat4, "^000090Girlfriend Hat^000000 - 50PCs",N_Hat5, "^000090Note Headphones^000000 - 100PC",N_Hat6, "丸麇泐",N_NVM; mes "[^2E3192Poring Catcher^000000]"; mes "Do you wanna exchange 50 Poring Coins on Guild Recruiting Hat?"; next; menu "Yes",-,"No",N_NVM; if (countitem(7539) < 50) goto N_NeedCoins; mes "[^2E3192Poring Catcher^000000]"; mes "Here, get yourGuild Recruiting Hat!"; delitem 7539,50; getitem 5336,1; logmes "Chatch the Poring: Guild Recruiting Hat"; close; N_Hat2: mes "[^2E3192Poring Catcher^000000]"; mes "Do you wanna exchange 50 Poring Coins on Party Hat?"; next; menu "Yes",-,"No",N_NVM; if (countitem(7539) < 50) goto N_NeedCoins; mes "[^2E3192Poring Catcher^000000]"; mes "Here, get yourParty Hat!"; delitem 7539,50; getitem 5337,1; logmes "Chatch the Poring: Party Hat"; close; N_Hat3: mes "[^2E3192Poring Catcher^000000]"; mes "Do you wanna exchange 50 Poring Coins on Boyfriend Hat?"; next; menu "Yes",-,"No",N_NVM; if (countitem(7539) < 50) goto N_NeedCoins; mes "[^2E3192Poring Catcher^000000]"; mes "Here, get yourBoyfriend Hat!"; delitem 7539,50; getitem 5338,1; logmes "Chatch the Poring: Boyfriend Hat"; close; N_Hat4: mes "[^2E3192Poring Catcher^000000]"; mes "Do you wanna exchange 50 Poring Coins on Friend Hat?"; next; menu "Yes",-,"No",N_NVM; if (countitem(7539) < 50) goto N_NeedCoins; mes "[^2E3192Poring Catcher^000000]"; mes "Here, get yourFriend Hat!"; delitem 7539,50; getitem 5339,1; logmes "Chatch the Poring: Friend Hat"; close; N_Hat5: mes "[^2E3192Poring Catcher^000000]"; mes "Do you wanna exchange 50 Poring Coins on Girlfriend Hat?"; next; menu "Yes",-,"No",N_NVM; if (countitem(7539) < 50) goto N_NeedCoins; mes "[^2E3192Poring Catcher^000000]"; mes "Here, get yourGirlfriend Hat!"; delitem 7539,50; getitem 5346,1; logmes "Chatch the Poring: Girlfriend Hat"; close; N_Hat6: mes "[^2E3192Poring Catcher^000000]"; mes "Do you wanna exchange 100 Poring Coins on Note Headphones?"; next; menu "Yes",-,"No",N_NVM; if (countitem(7539) < 100) goto N_NeedCoins; mes "[^2E3192Poring Catcher^000000]"; mes "Here, get your Note Headphones!"; delitem 7539,100; getitem 5151,1; logmes "Chatch the Poring: Note Headphones"; close; N_NeedCoins: mes "[^2E3192Poring Catcher^000000]"; mes "You demand additional coins. Go and get some."; close; N_NVM: mes "[^2E3192Poring Catcher^000000]"; mes "As you wish..."; close; } - script Poringsummoner -1,{ OnSummon: initnpctimer; OnTimer1000: mapannounce "poring_w01","5 ...",1; end; OnTimer2000: mapannounce "poring_w01","4 ...",1; end; OnTimer3000: mapannounce "poring_w01","3 ...",1; end; OnTimer4000: mapannounce "poring_w01","2 ...",1; end; OnTimer5000: mapannounce "poring_w01","1 ...",1; end; OnTimer6000: stopnpctimer; mapannounce "poring_w01","LET'S GO!",1; areamonster "poring_w01",84,119,121,90,"Poring",1002,1,"poringwin::OnMobKilled"; areamonster "poring_w01",84,119,121,90,"Pouring",1002,20,"poringlose::OnMobKilled"; areamonster "poring_w01",84,119,121,90,"Proing",1002,10,"poringlose::OnMobKilled"; areamonster "poring_w01",84,119,121,90,"Poiring",1002,20,"poringlose::OnMobKilled"; areamonster "poring_w01",84,119,121,90,"Poing",1002,10,"poringlose::OnMobKilled"; areamonster "poring_w01",84,119,121,90,"I am not Poring",1002,5,"poringlose::OnMobKilled"; areamonster "poring_w01",84,119,121,90,"Gniriop",1002,1,"poringlose::OnMobKilled"; areamonster "poring_w01",84,119,121,90,"Poring",1113,1,"poringlose::OnMobKilled"; areamonster "poring_w01",84,119,121,90,"Poring",1062,1,"poringlose::OnMobKilled"; areamonster "poring_w01",84,119,121,90,"Poriiing",1002,10,"poringlose::OnMobKilled"; areamonster "poring_w01",84,119,121,90,"PoriNg",1002,10,"poringlose::OnMobKilled"; areamonster "poring_w01",84,119,121,90,"Porong",1002,10,"poringlose::OnMobKilled"; areamonster "poring_w01",84,119,121,90,"P0ring",1002,10,"poringlose::OnMobKilled"; areamonster "poring_w01",84,119,121,90,"Por1ng",1002,10,"poringlose::OnMobKilled"; areamonster "poring_w01",84,119,121,90,"Porng",1002,1,"poringlose::OnMobKilled"; end; } - script poringwin -1,{ OnMobKilled: dispbottom "Congratulations. You've got me."; set .@PoringItemVar,rand(10); if (.@PoringItemVar == 9) { getitem 25092,5; warp "SavePoint",0,0; } if (.@PoringItemVar >= 4 && .@PoringItemVar < 9) { getitem 25092,5; warp "SavePoint",0,0; } getitem 25092,5; killmonster "poring_w01","All"; warp "SavePoint",0,0; end; } - script poringlose -1,{ OnMobKilled: dispbottom "Wahaha, you are looser!"; warp "SavePoint",0,0; percentheal -100,-100; sleep 1000; end; } poring_w01 mapflag nopenalty poring_w01 mapflag noloot poring_w01 mapflag noskill poring_w01 mapflag nowarpto poring_w01 mapflag nowarp poring_w01 mapflag noteleport poring_w01 mapflag nomemo poring_w01 mapflag nosave SavePoint poring_w01 mapflag nobranch
    1 point
  4. Version 1.0.0

    520 downloads

    Here are all the new mobs of episode Legacy Of Wise One 17.2, new monsters from Kro.
    Free
    1 point
  5. Version v.1.0

    494 downloads

    VOTE for the Sprite's or Post your comment in the Support Topic ---- File Info ---- This File Includes: Flam Lord Spr and Act File ---- Rules ---- 1. Do not claim my work as yours. 2. Do not remove or alter my signatures/watermarks within the sprites and all associated files. 3. Credit me if you use my work as a base. 4. Do not edit or alter my sprites in any way without permission from me. 5. Do not distribute my sprites on any file hosting sites.
    Free
    1 point
  6. Version v1.0

    859 downloads

    This ia a map of Ragnarok. It can be used in the shop stree. Anyway I wish you like it.
    Free
    1 point
×
×
  • Create New...