Jump to content

Tokei

Members
  • Posts

    665
  • Joined

  • Last visited

  • Days Won

    91

Everything posted by Tokei

  1. 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.
  2. A few things were updated: Zoom in and zoom out for the timeline preview panel. When playing back the animations, the speed will now actually match the FPS. Fixed a bug where frames would not show if they didn't explicitly have the interpolated markers.
  3. Heya, I've been working on a tool for a few weeks now and I believe it is in a ready enough state to be shown. This software is meant to edit str files, which are mostly used to display skill animations in-game. There may still be bugs left in the tool; reporting them here would be appreciated. You can download the software here: https://www.mediafire.com/file/epu1pr9xjdneupi Generic Ctrl-Z/Ctrl-Y to undo and redo an action. You can edit most shortcuts via File > Settings > Shortcuts. Transformations for the preview panel (same shortcuts as Act Editor) Translate: Left Mouse Button on the selected frame. Rotate: Shift-Left Mouse Button on the selected frame. Preview panel move: Right Mouse Button. Horizontal/vertical scaling: Ctrl-Shift-Left Mouse Button. Uniform scaling: Ctrl-Alt-Left Mouse Button. Unbound scaling: Ctrl-Left Mouse Button. Transformations for the edition panel Each layer can have multiple textures. To add a new one, click the texture combo box and select "Add new...". It will bring you to where the file is currently loaded from. While you can browse elsewhere, the textures must be in the same folder as your str file will be in. You can edit textures more rapidly with the gear button next to it. You can edit some fields by clicking the text before them. If you hold down the Left Mouse Button on this field (P1XY), you will be able to move it freely without moving the entire texture. This is especially handy when dealing with angles as those can give you unwanted results if you are editing them via the preview panel. The FPS property can be changed and saved. However, the client appears to completely ignore it and runs your animations at 60 FPS regardless. Editing an interpolated key frame will automatically create a new key frame on the timeline. Timeline panel A dot represents an existing key frame. An arrow represents an interpolated animation from the left key frame to the right key frame. You can right-click a key frame to bring up options: You can also copy the frame and move it elsewhere. The texture indexes are not re-adjusted. It copies the key frame as is. You can select multiple key frames by holding down the Left Shift key and holding down the Left Mouse Button. The traditional windows shortcuts can also be used for selection. These include: Arrow Key: move to the desired next frame. Ctrl-Arrow Key: move to the next key frame block in the wanted direction. Shift-Arrow Key: move to the next key frame for selection. Ctrl-Shift-Arrow Key: move to the next frame block while selecting what's inbetween. Double-Left Mouse Button: selects an entire frame and its interpolated section. Ctrl-A: selects the entire layer. You can move a key frame by selecting the key frame, clicking on the dot and then moving the key frame to the desired location. The operation above can also be done by selecting multiple rows at the same time. You can do a quick preview of the animation by moving the timeline selector. You can move a layer up and down by holding down the Left Mouse Button and moving it where you want it to. Right-clicking a layer also brings up more options. And I believe that's it! The next "feature" I wanted to implement was editing multiple frames at the same time, but unfortunately this project needs a small break from my end...! Hopefully some of you may have an use for it. Edit: I am most certainly not an animator and I do not know the real needs of those who will actually use the software. That is why it's being posted as a work in progress rather than a finished tool. If you have requests, feel free to post them below and I'll add as much as I can.
  4. Hmmm, not entirely sure about the issue. This part though: 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.
  5. 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); }
  6. 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.
  7. 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.
  8. Heya, Well, as the error says, your table index is nil, meaning either EFST_PAD_READER_KNIGHT or EFST_PAD_READER_CRUSADER is not defined (probably both and more below too). It's an issue with your lub, make sure your effectid.lub matches properly. This has nothing to do with NEMO.
  9. Hmm, you could just replace the gat files with the original ones. That should achieve the results you're looking for.
  10. Heya, Make sure you have the increase guild tax limit patch when you made your client. The restriction is client-sided, not server-sided.
  11. 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.
  12. 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.
  13. if (rand(1,100) < 1){ ^ is an impossible condition. Use if (rand(100) < 1) { instead.
  14. 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; }
  15. 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); } } }
  16. Personally though, I'd say you should make a yaml conf file where you define drop groups with a chance, then assign a mob to a drop group in your mob_db.yml file instead. It's more work, but it's also much more effecient than running a script. Then again, that requires more source knowledge I suppose.
  17. You'd still need to modify your source to do that. You can be more restrictive as well and attach more "parameters". killerid won't work as it isn't added to the script yet. So something like... if (src && src->type == BL_PC && bl->type == BL_MOB && damage > 0) { struct mob_data *md = (struct mob_data *)bl; 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); } OnEvent: switch($@attacked_mid) { case 1002: if (rand(100) < 5) { getitem 501, 1; } break; } end;
  18. It's possible, but it's also... very intensive for your server and I would highly recommend against it. In battle.cpp, in battle_calc_damage, add the NPC call: if (bl->type == BL_PC) { npc_event_do_id("MyNPC::OnEvent", bl->id); } And with the matching script: - script MyNPC -1,{ end; OnEvent: //callfunc("F_Function"); dispbottom "You have attacked."; end; } It would be much better to add code in the source for what you want to do instead.
  19. I loaded the maps you provided and there are no objects. So nothing to do with GRF Editor, but an issue with your local files or your client.
  20. Heya, You would have to share the map files you're trying to modify as there should be no issues with the settings you've picked.
  21. Well, the question is hard to answer because there is nothing wrong with the script. The announcements are clearly wrong, and it doesn't account for server reboots where the rates would be reset to Friday's rates, but besides that... it works as you'd expect. What issue do you have in particular?
  22. The job sprite does not get smaller. Neither in-game nor in Act Editor. The wing size has gotten smaller, though.
  23. Have you tried using Magnify (with anchor points)? If that's not what you're looking for, you'll have to use math to do what you want. Act files only use 1 anchor per frame.
  24. Well you can get the full command used with something like: OnNavigate: .@cmd$ = implode(.@atcmd_parameters$, " "); if (isloggedin(getcharid(3, .@cmd$)) != 1) { message strcharinfo(0), "Target player '" + .@cmd$ + "' is offline or do not exist."; } sleep2 1; unitwalkto getcharid(3), getcharid(3, .@cmd$); end; Though, unitwalkto is very limited and will most likely fail in most scenarios.
  25. Heya, Have you tried Scripts > Magnify? Use 0.5 to reduce the size by half. It's a decimal value that has no range limit; you can use -0.5 if you wanted to reduce by half and inverse the image too.
×
×
  • Create New...