Jump to content
The forums will be going offline for an extended maintenance period at 1400hrs GMT on 19th June 2025. The number of hours for this downtime is intentionally not advertised due to the nature of these upgrades. ×

Tokei

Members
  • Posts

    700
  • Joined

  • Last visited

  • Days Won

    108

Posts posted by Tokei

  1. 7 hours ago, DEsMOn said:

    Okay,

    But i noticed twice. when i did @reloadmobdb server crashes with same error in  cmd.

    But the problem is this happened before also when i didn't event use @reloadmobdb. So confused why its happening...

    The error you received, "Server received crash signal! Attempting to save all online characters!", is a generic error that means absolutely nothing besides "your server crashed". You will always get this same error. You most likely have two unrelated crashes there.

    As cook1e said above, you want to run your server with gdb (there is a link provided in his post that explains how to use it). Gdb is a debugging tool that will give you a stack trace. You will get the crash reason, followed by the line in your source code that crashed the server, followed by the functions that called your code step by step. To print the stack trace, you will want to use "bt full" after the crash.

    You should also always run your server with gdb as you can't predict when a crash will happen.

    Once you have the stack trace, you can share it here and people can tell you how to fix your code. Or they'll ask you to provide the code surrouding the crash. Or, if the error is obvious, you might be able to fix it yourself. But either way, we can't help you without a gdb stack trace. Goodluck!

    • Upvote 1
  2. On 4/5/2022 at 11:13 AM, DR4LUC0N said:

    When using the patch maker, is there a way to add the password to each grf or the key file so we can make a patch from encrypted grf and make the patch also encrypted using a password/key?

     

    Also is there a way to make a setting to allow "patch maker" put the new grf into a specific folder?

    No on all questions. Full disclosure, I forgot this feature even existed and I'm really tempted to simply nuke it. I'd say it's not a good practice to generate patches using this tool.

  3. Heya,

    If you are following the recommended setup, then the only required files are main.sql and logs.sql.

    The item_cash SQL file is the alternative to db/(pre-)re/item_cash_db.txt. Seeing are you're using the text/yaml version of the databases, you don't need it.

    As for roulette_default_data.sql, that's optional. If you plan on setting your own values in it, then you don't need the default values from the file. If you want pre-made values for it, then yes, use the file. The roulette system has not been converted to a text/yaml version for some reason. That seems like a forgotten feature.

    The other SQL files are not meant for performance. You will most likely be using them for your website though, since it will want to know your item/mob data from somewhere.

    • Upvote 1
  4. Heya,

    That's intended, surprisingly. When you are editing the hat sprite, you are viewing the world from the perspective of the hat. So if you set all the XY offsets the same, from... the perspective of the hat, nothing seems to be moving. That makes sense. But that doesn't work in-game because the body sprite has anchors points, which decides where the hat will be drawn. This position moves depending of the body's orientation. To "recreate" this, you'd have to use Anchors > Use body as base (this essentially attaches the current sprite to the body instead). In other words, this will set the perspective from the body.

    Though, in the end, that's not really that helpful to you because you'd have to set the offsets one by one. Plus, that's not possible to fully match those offsets, it will never work. Instead, do the following:

    • Align all the hat's anchors points with the base body.
    • Set all the offsets to a fixed value.

    This is not really possible by hand, so the following should do the trick (it uses the default body as reference, but it should be good enough):

    // Change to ref_body_f.act for the female anchor points
    var body = new Act(ApplicationManager.GetResource("ref_body_m.act"));
    
    for (int aid = 0; aid < act.Actions.Count; aid++) {
    	var action = act[aid];
    	
    	for (int fid = 0; fid < action.Frames.Count; fid++) {
    		var frame = action[fid];
    		var frameReference = body.TryGetFrame(aid, fid);
    		
    		if (frameReference != null) {
    			frame.Anchors[0].OffsetX = frameReference.Anchors[0].OffsetX;
    			frame.Anchors[0].OffsetY = frameReference.Anchors[0].OffsetY;
    		}
    	}
    }
    
    // Uncomment below if you want to set the same offsets for all your layers
    //foreach(var action in act.Actions) {
    //	foreach(var frame in action.Frames) {
    //		foreach(var layer in frame.Layers) {
    //			layer.OffsetY = -38;
    //			layer.OffsetX = 0;
    //		}
    //	}
    //}

    This will achieve what you're looking for. And yes, anchors points are quite confusing.

    Without using a script, this could also be done via Anchors > Set anchors > Set from file... > Select a base body sprite for reference.

  5. 7 hours ago, mizuki04 said:

    Hi rA, just needing help understanding how it works.. I wanted to fix some mini boss to not spawn slaves with exp bonus and drops from second summon forward like MvPs

    e.g

    1310,Majoruros@NPC_SUMMONSLAVE,idle,196,2,10000,2000,60000,no,self,slavele,0,1149,,,,,,
    1310,Majoruros@NPC_SUMMONSLAVE,idle,196,2,10000,2000,60000,no,self,slavele,0,1461,,,,,,

    what i did is i replaced the second one from mob ID 1149 to it's counterpart 1461 with no exp and drops but it didn't work. Any help would be suggested. Thank you!

    Heya,

    The last line is correct and should work as you want. Did you perhaps keep both lines? If so, when the mob goes through its skills it will execute them in order and since the first line has a 100% chance, it will always spawn the 1149 mobs. You have to comment it out or remove it. Otherwise, it could be a matter of not having reloaded your mob skills properly via @reloadmobdb (or a server restart I guess). Besides that, I do not see what could be the problem.

  6. Alright, there's been some updates...!

    • Texture names will be displayed over the keyframes.
      2HIWPkA.png
    • Re-organized the UI to clear up the right-sided panel.
    • The Play button has been moved on the menu bar itself, with the Space shortcut.
    • Adding a Snap option which is set to 1 pixel by default.
    • Added an experiemental feature to retrieve the bias values from str files (does not recognize bezier nor uvbias).
    • Can load and save with some EZV files (currently only tested with version 0.94 and 0.95). I haven't seen newer versions (not in RO anyway). It currently saves as version 0.94.
    • Added background selection via Edit > Select background.
    • (There are some unused buttons added, will clean up later.)
    • I do plan on supporting bezier curves, but there aren't for now.

     

    • Love 3
    • MVP 2
  7. Heya,

    I missed quite a few posts there, sorry. I didn't know this format was used on other platforms. The Ez2Visual tool was quite interesting actually, it almost feels like it could be the original tool for this file format. There are however issues with the conversion between STR and EZV. As @intron pointed out, there is an easing method used on some RO animations and that information is lost in the STR files. It's possible to retrieve it, to a degree, with some magic and guessing.

    The layer 0 now makes more sense. RO never uses it, so I simply skipped its visual in my tool instead. Though... what are you supposed to be able to do with the layer 0 exactly? Does it have restrictions? Is it simply another layer? I'm not sure about what its properties are meant to be.

    The UV parameters can be shown via File > Settings > Show texture coordinates fields. Though it only shows the first set of UV coordinates. The "uv2=0.0000,0.0000" and "uvs2=1.0000,1.0000" do not appear to be used in RO and I do not know what their purpose is. So I've hidden those fields entirely. The UVs in RO are pretty much always static and never used, so this option is hidden by default.

    It appears that the easing method used is r = time ^ (1 + bias / 5).

    I do see a field for "bezier=0.0000,0.0000  0.0000,0.0000", but I have not... found where this is used Ez2Visual. Where is this setting at? What does it actually do?

    STR files also lose the scale value in the process. I haven't played enough to see what can be done about this one, but that might be possible to retrieve.

    The ez2on link was not working for me, so I... have no idea what this tool is.

    So all in all, it would be possible to convert STR to EZV and vice versa. I'll have a bit more time to continue this tool in the following days.

  8. On 1/23/2022 at 3:15 PM, healthydude said:

    Apologies for bumping the thread, 

    First of all, thank you for taking the time to read my message.

    I also have similar issue.

    May I ask what I should do to fix this?

    Here are the things I did:
    1. Download GRF Editor via rAthena
    2. Install the latest GRF Editor (newest as of this date)

    3. No other DLLs in the GRF Editor folder
    4. Currently have .NET framework 4 (higher version, because when I tried downloading this, it told me that the .NET version is higher already)
    5. Run GRF Editor

    Note: I have used this software successfully before around 2020 but when I tried again today, on the same laptop, it starts not working anymore and showing up this error.

    Exact error that shows up for me:

    Hmmm, not entirely sure about the issue. This part though:

    Quote

    1. Download GRF Editor via rAthena
    2. Install the latest GRF Editor (newest as of this date)

    is confusing to me. The version on rAthena is not updated; the latest version available is "GRF Editor v1.8.4.1" and can be found on the mediafire link given on the download page ( https://www.mediafire.com/file/aflylbhblrzpz0h ). But it seems you have mismatching DLL files...? You could try moving the executable (GRF Editor.exe) to its own empty folder. The error itself is quite vague though. GRF Editor is compiled with .NET 3.5 (Client Profile), so you could try installing 3.5 alongside as well. 4.0 should work, but it's hard to tell with Windows's shenanigans sometimes. Can't really help you more though, it seems to be working fine for most people as far as I know, so the issue seems very specific to your Windows configuration.

    • Upvote 1
  9. There are many ways to achieve that:

    foreach (var action in act) {
    	action.Frames = action.Frames.Take(1).ToList();
    }

    If you need more... "control" with indexes and which animations to remove exactly, you can do it this way too:

    for (int aid = 0; aid < act.Actions.Count; aid++) {
    	for (int fid = act.Actions[aid].Frames.Count - 1; fid >= 1; fid--) {
    		act[aid].Frames.RemoveAt(fid);
    	}
    }

    If you want to apply this to a batch of files, you can do it this way too:

    var path = @"C:\Sprites\";
    
    foreach (var file in Directory.GetFiles(path, "*.act")) {
    	var actFile = new Act(file);
    	
    	actFile.Actions.ForEach(p => p.Frames = p.Frames.Take(1).ToList());
    	actFile.Save(file);
    }

     

  10. On 1/20/2022 at 9:23 PM, skyeang3l said:

    Hello. I'm new to this. Thanks for your work.

    I am trying to add some custom sprites to my .grf but everytime I save I am getting the error "There is not enough space on the disk". 

    You need more space on your Windows partition drive (normally C) as it writes temporary files in "%appdata%/GRF Editor".

    It can require to write the entire file to the temporary folder (and then move it to your actual desired location) if GRF Editor "defragments" your GRF while saving.

  11. On 1/8/2022 at 9:34 AM, oil753951 said:

    hello when I save data.grf file even without edit anything data.grf file size is change and when open RO it closed immediately and when I validate content it got error 

    when install grf editor what is other program needed to support grf editor?

    Your error is too vague, it's impossible to know the issue from it. As for the size, it changes because it removes unused space from the file.

  12. 9 hours ago, ocarinas said:

    Hello, in Flatmap maker, is it possible to let walkable tiles on objects stay at its original height levels?

    In the first pic belows you can see that the walkable tiles for the boat drop to the bottom of the map when made into a flatmap.

    This might be a weird question but I really need a way to achieve this for my own project.

    GRF-Editor-g-LIV7k-Qqdl.pngGRF-Editor-JTPsg-SAt-Ix.png

    Hmm, you could just replace the gat files with the original ones. That should achieve the results you're looking for.

  13. Heya,

    The error message tells you the error:

    if (.msg_die)
    	message .@victimaid, "You have been killed by "+ .@killername$;
    if (.msg_kill)
    	message .@killeraid, "You just killed "+ .@victimname$;

    The "message" script command on rAthena requires two strings as parameters. First parameter is the player name (which is pretty weird, not gonna lie), so you should change those to:

    if (.msg_die)
    	message .@victimname$, "You have been killed by "+ .@killername$;
    if (.msg_kill)
    	message .@killername$, "You just killed "+ .@victimname$;

    Though clearly this script wasn't meant for rAthena.

  14. Heya,

    Well there's a big amount of information missing here, but if it's activating stone curse, it's usually because the status given to sc_start is 0. This happens because your new status is not defined as a constant that can be used in your scripts. So go in map/script_constants.hpp, and make sure that your variable is listed, for example:

    export_constant(SC_CUSTOMSTATUS);

    Also make sure that the status used in your item script matches the name of the status correctly.

  15. It's a client issue. Change the clif_add_random_options function to skip empty entries. Something like...

    /// Fills in part of the item buffers that calls for variable bonuses data. [Napster]
    /// A maximum of 5 random options can be supported.
    static uint8 clif_add_random_options( struct ItemOptions buf[MAX_ITEM_RDM_OPT], struct item* it ){
    	nullpo_retr( 0, it );
    
    	uint8 count = 0;
    	
    	memset(buf, 0, sizeof(struct ItemOptions) * MAX_ITEM_RDM_OPT);
    	
    	for( int i = 0; i < MAX_ITEM_RDM_OPT; i++ ){
    		if( it->option[i].id ){
    			buf[count].index = it->option[i].id;	// OptIndex
    			buf[count].value = it->option[i].value;	// Value
    			buf[count].param = it->option[i].param;	// Param1
    			count++;
    		}
    	}
    	
    #if MAX_ITEM_RDM_OPT < 5
    	for( ; i < 5; i++ ){
    		buf[i].index = 0;	// OptIndex
    		buf[i].value = 0;	// Value
    		buf[i].param = 0;	// Param1
    	}
    #endif
    
    	return count;
    }

     

    • Upvote 1
  16. 1 hour ago, Almond Snicker said:

    that would be correct. yaml is just new to me still so I think I'll stick with the script.

    However, question.. as long as other monsters are not included on the "case", they won't be triggered right? what I mean is that it won't affect the server load if you attack other monsters?

    Thank you so much for the clarification and the assistance.

    It will affect your server load, yes. You would need to add a restriction in the source such as:
     

    	if (src && src->type == BL_PC && bl->type == BL_MOB && damage > 0) {
    		struct mob_data *md = (struct mob_data *)bl;
    		
    		if (md->id == 1002) {
    			mapreg_setreg(reference_uid(add_str("$@attacked_mid"), 0), md->id);
    			mapreg_setreg(reference_uid(add_str("$@attacked_gid"), 0), md->bl.id);
    			npc_event_do_id("MyNPC::OnEvent", src->id);
    		}
    	}

    That on its own would be more reasonable, but if you have... I don't know, 10 people attacking the mob with 193 aspd, I'd be concerned. You'd probably want to do it all in the source instead, or at the very least put the chance of drop in the source. Something like...

    	if (src && src->type == BL_PC && bl->type == BL_MOB && damage > 0) {
    		struct mob_data *md = (struct mob_data *)bl;
    		struct map_session_data *sd = (struct map_session_data *)src;
    		
    		if (md->id == 1002 && (rnd() % 100) < 5) {	// 5% chance
    			struct item it;
    			t_itemid nameid = 501;
    			int flag;
    			
    			memset(&it,0,sizeof(it));
    			it.nameid = nameid;
    			it.identify = 1;
    			it.bound = BOUND_NONE;
    			
    			// Assuming it is not a pet egg, you can skip some checks. Up to you at this point.
    			if ((flag = pc_additem(sd, &it, 1, LOG_TYPE_SCRIPT))) {
    				clif_additem(sd, 0, 0, flag);
    			}
    		}
    	}

     

×
×
  • Create New...