Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 10/23/24 in Posts

  1. 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.
    1 point
  2. i'm trying to contact you too, how can i? Ps: sry to bump this post
    1 point
  3. Problem SOLVED. I figured it out by myself. ^^ When i was testing it i deleted statuses in the status.c in the meantime when i tested NoRemoveOnDead flag but than i found out that both of these things have to be changed. In case that someone will have similar problem: You have to change status.c and you have to add NoRemoveOnDead flag into your status.yml DB file (also be sure that your server reads the right status.yml DB file). If it's added on both places than it's working properly and status is not removed after dead.
    1 point
  4. 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.
    1 point
  5. 1 point
  6. This is not really script request. Because with scripts you should to do a lot of work for controlling mobs, do a lot of arrays, do a lot of checks, and you will not know exact time when MVP spawned. Why do you need to do all of this job, if you can try to use src edits? Here what you need to do: 1. Open mob.c and find next function int mob_delayspawn(int tid, unsigned int tick, int id, intptr_t data) 2. In this function find mob_spawn(md); and above or below add next code // if monster boss -> do announce if( md->spawn->state.boss ) { char message[128]; sprintf(message, "[MVP Spawn]: %s has been spawned on his map.", md->name); clif_broadcast(&md->bl, message, strlen(message) + 1, BC_DEFAULT, ALL_CLIENT); } P.S. if you do not understand where need to add code above, just look function uploaded here: https://gist.github.com/anacondaqq/b0c7729aa4ed9ee73c9a45705f8daec4 Or here is diff patch: link Here is screen when i kill Tao, (tomb system enabled, mvp re-spawn time decreased in monster.conf to avoid log waiting for mvp re-spawn (just for testing this custom source mode above). Then i go to another map just to confirm that mod showing announces for all connected players to the game on any map. As you see i sitting at prt_fild, and just waiting for announce. So, as you see this mod show you if some mvp spawned. It will NOT affect @reloadscript, and reloadmobdb, it will affect only spawn data if mob killed by someone. Have fun P.S. if you wish to see where exactly spawned mob (like on screen below) replace line in modification above: sprintf(message, "[MVP Spawn]: %s has been spawned on his map.", md->name); to: sprintf(message, "[MVP Spawn]: %s has been spawned on %s map.", md->name, map_mapid2mapname(md->spawn->m));
    1 point
  7. Go to status.c, find this line: int status_change_clear(struct block_list* bl, int type) Above this, will have some commented lines explaining: /** * End all statuses except those listed * TODO: May be useful for dispel instead resetting a list there * @param src: Source of the status change [PC|MOB|HOM|MER|ELEM|NPC] * @param type: Changes behaviour of the function * 0: PC killed -> Place here statuses that do not dispel on death. * 1: If for some reason status_change_end decides to still keep the status when quitting. * 2: Do clif_changeoption() * 3: Do not remove some permanent/time-independent effects * @return 1: Success 0: Fail */ So, just below it, there's a list that's start like: if(type == 0) { switch (i) { // Type 0: PC killed -> Place here statuses that do not dispel on death. case SC_ELEMENTALCHANGE: // Only when its Holy or Dark that it doesn't dispell on death if( sc->data[i]->val2 != ELE_HOLY && sc->data[i]->val2 != ELE_DARK ) break; case SC_WEIGHT50: case SC_WEIGHT90: case SC_EDP: case SC_MELTDOWN: case SC_WEDDING: case SC_XMAS: case SC_SUMMER: case SC_HANBOK: case SC_OKTOBERFEST: case SC_NOCHAT: case SC_FUSION: case SC_EARTHSCROLL: case SC_READYSTORM: case SC_READYDOWN: case SC_READYCOUNTER: case SC_READYTURN: case SC_DODGE: case SC_JAILED: case SC_EXPBOOST: case SC_ITEMBOOST: case SC_HELLPOWER: case SC_JEXPBOOST: case SC_AUTOTRADE: case SC_AUTOREFRESH: case SC_WHISTLE: case SC_ASSNCROS: case SC_POEMBRAGI: case SC_APPLEIDUN: case SC_HUMMING: case SC_DONTFORGETME: case SC_FORTUNE: case SC_SERVICE4U: case SC_FOOD_STR_CASH: case SC_FOOD_AGI_CASH: case SC_FOOD_VIT_CASH: case SC_FOOD_DEX_CASH: case SC_FOOD_INT_CASH: case SC_FOOD_LUK_CASH: case SC_SAVAGE_STEAK: case SC_COCKTAIL_WARG_BLOOD: case SC_MINOR_BBQ: case SC_SIROMA_ICE_TEA: case SC_DROCERA_HERB_STEAMED: case SC_PUTTI_TAILS_NOODLES: case SC_DEF_RATE: case SC_MDEF_RATE: case SC_INCHEALRATE: case SC_INCFLEE2: case SC_INCHIT: case SC_ATKPOTION: case SC_MATKPOTION: case SC_S_LIFEPOTION: case SC_L_LIFEPOTION: case SC_PUSH_CART: case SC_ALL_RIDING: case SC_LIGHT_OF_REGENE: case SC_STYLE_CHANGE: case SC_MOONSTAR: case SC_SUPER_STAR: case SC_HEAT_BARREL_AFTER: case SC_STRANGELIGHTS: case SC_DECORATION_OF_MUSIC: case SC_QUEST_BUFF1: case SC_QUEST_BUFF2: case SC_QUEST_BUFF3: case SC_2011RWC_SCROLL: case SC_JP_EVENT04: continue; } } Add it before continue; ... case SC_QUEST_BUFF3: case SC_2011RWC_SCROLL: case SC_JP_EVENT04: case SC_MYCUSTOMSTATUS: continue; } } Then, recompile. Also, before making a thread, use the Search Tool. Your question has been answered here.
    1 point
  8. Oh sorry, I didn't read that properly. Give me a minute, I'll edit this post. Ctrl+F MvP tomb in your npc.c file to find this segment. // MvP tomb [GreenBox] void run_tomb(struct map_session_data* sd, struct npc_data* nd) { char buffer[200]; char time[10]; strftime(time, sizeof(time), "%H:%M", localtime(&nd->u.tomb.kill_time)); // TODO: Find exact color? snprintf(buffer, sizeof(buffer), msg_txt(sd,657), nd->u.tomb.md->db->name); clif_scriptmes(sd, nd->bl.id, buffer); clif_scriptmes(sd, nd->bl.id, msg_txt(sd,658)); snprintf(buffer, sizeof(buffer), msg_txt(sd,659), time); clif_scriptmes(sd, nd->bl.id, buffer); clif_scriptmes(sd, nd->bl.id, msg_txt(sd,660)); snprintf(buffer, sizeof(buffer), msg_txt(sd,661), nd->u.tomb.killer_name[0] ? nd->u.tomb.killer_name : "Unknown"); clif_scriptmes(sd, nd->bl.id, buffer); clif_scriptclose(sd, nd->bl.id); } Change the line strftime(time, sizeof(time), "%H:%M", localtime(&nd->u.tomb.kill_time)); to strftime(time, sizeof(time), "%H", localtime(&nd->u.tomb.kill_time)); You'll likely want to change the line from map_msg.conf to 659: Hour of Death : ^EE0000%s^000000
    1 point
×
×
  • Create New...