Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 08/23/20 in all areas

  1. Hi everyone, It's been a while since I've published something. Today I'm releasing the code of a patcher I've been working on for some time. The idea was to make an open-source drop-in replacement for the Thor patcher while also bringing some improvements. The project has been developed in Rust and the UI is based on the webview project. The project also includes a cross-platform, command-line THOR patch generator. The patcher's current features are the following: Customizable, web-based UI Cross-platform (Windows 7/8/10, Linux, macOS) Configurable through an external YAML file HTTP/HTTPS support GRF file patching (version 0x101, 0x102, 0x103 and 0x200) THOR patch format support Drop-in replacement for the Thor patcher SSO login support (i.e., can act as a launcher) Manual patching Can use multiple patch mirrors The project's repository can be found here: https://github.com/L1nkZ/rpatchur (and documentation can be found here). Contributions are welcome! Releases v0.3.0: https://github.com/L1nkZ/rpatchur/releases/tag/v0.3.0 v0.2.3: https://github.com/L1nkZ/rpatchur/releases/tag/v0.2.3 v0.2.2: https://github.com/L1nkZ/rpatchur/releases/tag/v0.2.2 v0.2.1: https://github.com/L1nkZ/rpatchur/releases/tag/v0.2.1 v0.2.0: https://github.com/L1nkZ/rpatchur/releases/tag/v0.2.0 v0.1.0: https://github.com/L1nkZ/rpatchur/releases/tag/v0.1.0
    2 points
  2. Hello people, I'm Katakuri. I'm on a part of learning deeply on spriting and I hoped you like it. ----------------------------------------------------------------------------------------------------------------------------- Various headgears, monster & weapons from different anime. ----------------------------------------------------------------------------------------------------------------------------- 2020 Update Equipment Set for each job/classes Seven Deadly Sins - Sacred Treasure Weapons Monsters Vermilion Bird Suzaku Midgard's Bane Grordag the Twin Head Wounded Dragon Giant Rat - with Recolors Tailed Cape Squid Game Hoodie Attack on Titan - Faction Capes Elemental Garments Demon Slayers FREE RELEASE Owl Mask Link Chubby Meow Link Randoseru / School Bag (Japanese) Link Notes: 1. Sprites came from different game resources which I reworked to make it ROish looks. 2. I won't teach where to find raw image references of it. 3. I will always update this topic as I accomplished something new. 4. I'm newbie regards this matter but I always helping myself to get better. 4. Feel free to comment thanks. 5. If you want to contact me here's my discord. Katakuri#4880 For more works of mine kindly join us on our discord channel! Link: Click me for Discord Link!
    1 point
  3. Title Bonus System Hello everyone, in some MMORPGs like Grand Fantasia there is the possibility of obtaining bonus/buffs from equipping Titles, now I have brought that feature to RO. Features - This modification is script-bonus based, so you can apply all bonus from "doc/item_bonus.txt". - There is a file called "title_bonus.yml" in db folder in which you can add/edit title bonuses. - All existing titles have their respective Status Icon, however, you must sync description from Lua if you edit a title buff. Video
    1 point
  4. Original guide is in Hercules forum, I just import the information into rAthena since both emulator share most of the similar trait when using query_sql and I guess the main reason is Olrox reminded me to do so ... because someone else might claim it as their own ... etc Anyway, this guide is a compilation of SQL commands that I have used, or Questions answered on the forum every single subject here are related to rAthena/Ragnarok Online in some ways, so you won't feel bored reading them XD Table of Content 1. When to use *escape_sql script command 2. How to build a case-sensitive table 3. Choose a table type, MyISAM or InnoDB ? 3a. How to index a table properly 3b. Why you shouldn't use `char_reg_num` table 4. AUTO_INCREMENT 5. How to do IF-ELSE in SQL query ? 5a. How to update multiple rows on different conditions in a single query 6. How to show the current rank of the player 7. INSERT INTO ... SELECT ... 8. Table JOIN vs AS 9. What is the maximum string limit for *query_sql 9a. UNION This topic will open to Suggestions, Ideas, Improvements, and Questions ~ You may also post up your tricks if you want to share with us 1. When to use escape_sql script command . input .@haha$; dispbottom .@haha$; dispbottom escape_sql(.@haha$); it doesn't has much differences, because it only affect 3 special characters ' <- single quotation mark " <- double quotation mark \ <- left slash if I input -> haha"lala'hehe <- it will return -> haha\"lala\'hehe <- this is what we call, Escape a character in rAthena script, we also know we can use " symbol in any string input mes "Susan says :\" Today I ate 3 eggs \"."; where in the game client, you can see the " symbol in the npc msg box let's say I have a sql script like this prontera,153,171,5 script Show Characters 1_F_MARIA,{ mes "input name, I'll show you all characters name it has on that player's account"; input .@name$; .@nb = query_sql("SELECT `char_id`, `name` FROM `char` WHERE `name` LIKE '"+ .@name$ +"'", .@cid, .@name$); if ( !.@nb ) { mes "no result"; close; } for ( .@i = 0; .@i < .@nb; ++.@i ) mes .@cid[.@i] +" "+ .@name$[.@i]; close; } this script has a possibility to be hacked because to perform sql injection, I can enclose the string with quotation mark, then use another sql command to hack BUT with an escape_sql command, if the user want to enclose the string with quotation mark to hack the script the escape_sql command escaped the string, the quotation mark the user input will be escaped thus the script will become impossible to hack just now that script was for string input prontera,153,171,5 script Show Characters 1_F_MARIA,{ mes "input account ID, I'll show you all characters name it has on that player's account"; input .@aid$; .@nb = query_sql("SELECT `char_id`, `name` FROM `char` WHERE `account_id` = "+ escape_sql(.@aid$), .@cid, .@name$); if ( !.@nb ) { mes "no result"; close; } for ( .@i = 0; .@i < .@nb; ++.@i ) mes .@cid[.@i] +" "+ .@name$[.@i]; close; } this is another stupid case. 1. the scripter use string input while the script just needed a number 2. even with escape_sql command over there, there is no quotation mark at all yes this script also has a risk to be hack because escape_sql only escape quotation mark. that hacker don't even have to input quotation mark because it is a number and an injection query can be sent without any quotation mark input there are 2 ways to solve this either use numeric variable for the input command or enclose that .... ..... WHERE `account_id` = '"+ escape_sql(.@aid$) +"'", .... with single quotation mark, when the hacker input a quotation mark will be escaped by escape_sql command Reference : https://www.w3schools.com/sql/sql_injection.asp escape_sql command for another thing is if the player register their names containing ' or ", these characters are escaped only happens when the server have no restriction on the creation of players name rAthena\conf\char_athena.conf // Manage possible letters/symbol in the name of charater. Control character (0x00-0x1f) are never accepted. Possible values are: // NOTE: Applies to character, party and guild names. // 0: no restriction (default) // 1: only letters/symbols in 'char_name_letters' option. // 2: Letters/symbols in 'char_name_letters' option are forbidden. All others are possibles. char_name_option: 1 and this was what happened to my SQL dota pvpladder script Silo's Babies <-- this is a guild name you can see the 5th string has a single quotation mark with escape_sql command, that string will turn into Silo\'s Babies <-- the quotation mark is escaped when send to sql query 2. How to build a case-sensitive table this is the answer I found Reference : http://dba.stackexchange.com/questions/15250/how-to-do-a-case-sensitive-search-in-where-clause by default, the table creation use charset = latin1; means it couldn't do a case-sensitive search if you want to do a case-sensitive in a query, use BINARY SELECT * FROM `char` WHERE `name` = BINARY('AnnieRuru'); however using BINARY might have performance hit if it is a big table so its more recommend to convert your SQL table to collate with latin1_general_cs let's say this is a sample table CREATE TABLE `test` ( `id` INT(11) PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(23) )ENGINE = InnoDB; do an ALTER table syntax ALTER TABLE `test` MODIFY COLUMN `name` VARCHAR(23) COLLATE latin1_general_cs; or just put it into the table creation CREATE TABLE `test` ( `id` INT(11) PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(23) )ENGINE = InnoDB DEFAULT CHARSET = latin1 COLLATE latin1_general_cs; 3. Choose a table type, MyISAM or InnoDB ? https://stackoverflow.com/questions/20148/myisam-versus-innodb Before MySQL 5.5, MyISAM is mostly use for read-heavy + table locking storage engine = such as pvp ladder ( always select ... order by kill desc ) InnoDB is mostly use for write-heavy + row locking storage engine = such as quest script ( select ... from char_id ... only 1 row is retrieve ) After MySQL 5.6, (currently is 8.0) just stick to InnoDB there is only 1 reason MyISAM is better than InnoDB - MyISAM use smaller disk usage than InnoDB let's take a look at rAthena MyISAM to InnoDB converter https://github.com/rathena/rathena/blob/master/sql-files/tools/convert_engine_innodb.sql This converter is useful if you are using MySQL 5.6 or above There are 4 tables that are commented out the reason is simple, these 4 tables only read once and forgotten when server is live since MyISAM is good at reading (SELECT) + smaller disk usage, its no use to convert these 4 tables into InnoDB 3a. How to index a table properly http://mysql.rjweb.org/doc.php/index_cookbook_mysql http://www.dbta.com/Columns/DBA-Corner/Top-10-Steps-to-Building-Useful-Database-Indexes-100498.aspx a simple thumb of rule, anything that is SELECT .... WHERE `field` = ..... that `field` has to be index let's take a look at this PVP Ladder script that use Kill/Death ratio CREATE TABLE `pvpladder` ( `char_id` INT(11), `name` VARCHAR(23), `kills` INT(11), `death` INT(11), PRIMARY KEY (`char_id`), KEY (`kills`, `death`) ) ENGINE = InnoDB; prontera,155,186,6 script PVP Ladder 1_F_MARIA,{ .@nb = query_sql( "SELECT `name`, `kills`/(`death`+1) FROM `pvpladder` WHERE `kills` > 0 ORDER BY `kills`/(`death`+1) DESC LIMIT 10", .@name$, .@ratio$ ); if ( !.@nb ) { mes "no entry"; close; } mes "Current Ranking :"; for ( .@i = 0; .@i < .@nb; ++.@i ) mes "No."+(.@i +1)+" ["+ .@name$[.@i] +"] "+ .@ratio$[.@i] +" kill"; close; OnPCKillEvent: if ( killedrid == getcharid(3) ) { // killing self should only increase death count. EG: Grand-cross query_sql "INSERT INTO `pvpladder` VALUES ( "+ getcharid(0) +", '"+ escape_sql( strcharinfo(0) )+"', 0,1 ) ON DUPLICATE KEY UPDATE `death` = `death` +1"; end; } query_sql "INSERT INTO `pvpladder` VALUES ( "+ getcharid(0) +", '"+ escape_sql( strcharinfo(0) )+"', 1,0 ) ON DUPLICATE KEY UPDATE `kills` = `kills` +1"; attachrid killedrid; query_sql "INSERT INTO `pvpladder` VALUES ( "+ getcharid(0) +", '"+ escape_sql( strcharinfo(0) )+"', 0,1 ) ON DUPLICATE KEY UPDATE `death` = `death` +1"; end; } This kind of query -> ORDER BY kills/death, needs to index them together like this KEY (`kills`, `death`) 3b. Why you shouldn't use `char_reg_num` table There are 2 reasons why you shouldn't even touch all these variable tables Reason no.1 This table is sorely meant for server usage Once these data is loaded, it is process internally, and only save character data according to this configuration Reason no.2 The `value` field is not index ! This line has ORDER BY `value`, try recheck our main.sql file CREATE TABLE IF NOT EXISTS `char_reg_num` ( `char_id` int(11) unsigned NOT NULL default '0', `key` varchar(32) binary NOT NULL default '', `index` int(11) unsigned NOT NULL default '0', `value` int(11) NOT NULL default '0', PRIMARY KEY (`char_id`,`key`,`index`), KEY `char_id` (`char_id`) ) ENGINE=MyISAM; SQL will search through every single line in the `value` field if that column isn't index Of course you can ... do ALTER table to add KEY to the `value` field but this table has already optimized in that way for server usage the more field you index into the table, the more disk usage space it use Conclusion : If you want to make a custom script, then make a custom table. Leave these table alone ! 4. AUTO_INCREMENT CREATE TABLE `support_ticket` ( `id` INT(11) AUTO_INCREMENT, `title` VARCHAR(70), `message` VARCHAR(255), PRIMARY KEY (`id`) ) ENGINE = InnoDB; In this kind of query that has AUTO_INCREMENT, many people do .... $support_ticket_id++; query_sql "INSERT INTO `support_ticket` VALUES ( "+ $support_ticket_id +", '"+ escape_sql(.@title$) ... can be optimize .... using NULL query_sql "INSERT INTO `support_ticket` VALUES ( NULL, '"+ escape_sql(.@title$) ... can retrieve the last row with query_sql "SELECT MAX(`id`) FROM `support_ticket`", .@id; // ----- OR ----- query_sql "SELECT LAST_INSERT_ID()", .@id; Question : This question was asked on eathena forum board One of my friend touched my custom table and the AUTO_INCREMENT has jump off the value | 1 | <data set 1> | 2 | <data set 2> | 3 | <data set 3> | 25854 | <data set 4> | 25855 | <data set 5> | 25856 | <data set 6> I want to make the value return back to normal as shown | 1 | <data set 1> | 2 | <data set 2> | 3 | <data set 3> | 4 | <data set 4> | 5 | <data set 5> | 6 | <data set 6> How to do this WITHOUT losing any of the current data ? Answer: The trick is ... just drop that column and rebuild it ALTER TABLE `inventory` DROP COLUMN `id`; ALTER TABLE `inventory` ADD COLUMN `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST; convert the table into MyISAM will process the query much faster 5. How to do IF-ELSE in SQL query ? Question : I have a PVP ladder script that runs on Points system. Each kill plus 1 point and each death minus 1 point. The problem is, this query will make the points go into negative value if the player is being kill repeatedly query_sql "UPDATE `pvp_points` SET `points` = `points` - 1 WHERE `char_id` = "+ getcharid(0); How do I make the points stop at 0 if the player is already at 0 points ? Answer : query_sql "UPDATE `pvp_points` SET `points` = IF(`points` = 0, 0, `points` - 1) WHERE `char_id` = "+ getcharid(0); query_sql "UPDATE `pvp_points` SET `points` = (CASE WHEN `points` = 0 THEN 0 ELSE `points` - 1 END) WHERE `char_id` = "+ getcharid(0); Explanations: similar to rAthena script language, if (<condition>) <execute true condition>; else <execute false condition>; in SQL language IF(<condition>, <execute true condition>, <execute false condition>) CASE WHEN <condition> THEN <execute true condition> ELSE <execute false condition> END Reference : https://www.w3schools.com/sql/func_mysql_if.asp https://stackoverflow.com/questions/63447/how-do-i-perform-an-if-then-in-an-sql-select 5a. How to update multiple rows on different conditions in a single query This query will update multiple rows on different condition UPDATE `pvpladder` SET `points` = CASE WHEN `char_id` = 150000 THEN `points` +1 WHEN `char_id` = 150001 THEN `points` -1 END WHERE `char_id` IN (150000,150001); Reference : https://stackoverflow.com/questions/20255138/sql-update-multiple-records-in-one-query 6. How to show the current rank of the player Question : This is the part of the script, output as below .@nb = query_sql("SELECT `name`, `kills` FROM `pvpladder` ORDER BY `kills` DESC LIMIT 5", .@name$, .@kills); for ( .@i = 0; .@i < .@nb; .@i++ ) mes "No."+(.@i+1)+" ["+ .@name$[.@i] +"] ~ "+ .@kills[.@i] +" kills"; No.1 [Alice] ~ 19 kills No.2 [Emily] ~ 11 kills No.3 [Irene] ~ 11 kills No.4 [Brittany] ~ 8 kills No.5 [Fiona] ~ 7 kills 2nd place and 3rd place has the same amount of kills, how do I make both of them display as 2nd place like this ? No.1 [Alice] ~ 19 kills No.2 [Emily] ~ 11 kills No.2 [Irene] ~ 11 kills No.4 [Brittany] ~ 8 kills No.5 [Fiona] ~ 7 kills Answer : Method no.1: Convert the table into InnoDB will return the result faster. Allow to use OFFSET .@nb = query_sql("SELECT `name`, `kills`, FIND_IN_SET(`kills`, (SELECT GROUP_CONCAT(`kills` ORDER BY `kills` DESC) FROM `pvpladder`)) FROM `pvpladder` ORDER BY `kills` DESC LIMIT 5", .@name$, .@kills, .@rank); for ( .@i = 0; .@i < .@nb; ++.@i ) mes "No."+ .@rank[.@i] +" ["+ .@name$[.@i] +"] ~ "+ .@kills[.@i] +" kills"; Method no.2: This method return result faster than method 1 in huge table. Not allow to use OFFSET .@query$ = "SELECT `name`, IF(@d=t.`kills`, @r, @r:=@i), @d:=t.`kills`, @i:=@i+1 "; .@query$ += "FROM `pvpladder` t, (SELECT @d:=0, @r:=0, @i:=1)q "; .@query$ += "ORDER BY `kills` DESC LIMIT 5"; .@nb = query_sql(.@query$, .@name$, .@rank, .@kills, .@dummy); for ( .@i = 0; .@i < .@nb; ++.@i ) mes "No."+ .@rank[.@i] +" ["+ .@name$[.@i] +"] ~ "+ .@kills[.@i] +" kills"; . . Question : How do I show the current ranking of the player ? mes "Your kills -> "+ .@kills; mes "Your rank -> "+ .@rank; Answer : query_sql "SELECT `kills`, 1+(SELECT COUNT(1) FROM `pvpladder` t1 WHERE t1.`kills` > t2.`kills`) FROM `pvpladder` t2 WHERE `char_id` = "+ getcharid(0), .@kills, .@rank; Remember to index the `kills` field Reference : https://dba.stackexchange.com/questions/13703/get-the-rank-of-a-user-in-a-score-table . 7. INSERT INTO ... SELECT ... Question : This question was asked on eathena forum . Note: at the time the old mail system was unstable and not many server use it I want to reward my players for supporting my server. I want to give every player who are still actively login in this year (2010) an item ID 22574 in their storage How do I achieve this ? Answer : Run this SQL command when your server is offline INSERT INTO `storage` (`account_id`, `nameid`, `amount`, `identify`) SELECT `account_id`, '22574', '1', '1' FROM `login` WHERE DATE(`lastlogin`) >= '2010-01-01' && `account_id` !=1; The reply from the topic starter gives a feed back, including this Inserted rows: 7738 Inserted row id: 8244859 (Query took 13.6253 sec) 8. Table JOIN vs AS CREATE TABLE `pvpladder` ( `char_id` int(11) PRIMARY KEY, `points` int(11) ) ENGINE = InnoDB; This table is missing the `name` field. So have to retrieve the `name` from the `char` table. A simple way is using table JOIN SELECT `char`.`char_id`, `char`.`name` , `pvpladder`.`points` FROM `pvpladder` LEFT JOIN `char` ON `pvpladder`.`char_id` = `char`.`char_id` ORDER BY `pvpladder`.`points` DESC LIMIT 10; However, there is an uncommon method, the same thing can be done using Aliases SELECT `char_id` AS `CID`, (SELECT `name` FROM `char` WHERE `char_id` = `CID`), `points` FROM `pvpladder` ORDER BY `points` DESC LIMIT 10; In this example, both tables `char` and `pvpladder` have the `char_id` field index as PRIMARY KEY and thus both examples return the result in same amount of time However, there is a key difference on the optimization speed if the one of the table is not index properly The below example, `item_id`.`id` field is index as PRIMARY KEY, but `mob_db`.`DropCardid` is not index SELECT `mob_db`.`ID`, `mob_db`.`kname`, `item_db`.`id`, `item_db`.`name_japanese` FROM `mob_db` LEFT JOIN `item_db` ON `mob_db`.`DropCardid` = `item_db`.`id` WHERE `mob_db`.`DropCardid` > 0; SELECT `ID`, `kname`, `DropCardid` AS `ITEM_ID`, (SELECT `name_japanese` FROM `item_db` WHERE `id` = `ITEM_ID`) FROM `mob_db` WHERE `mob_db`.`DropCardid` > 0; The 2nd query that uses Aliases will return result faster than table JOIN in this case Conclusion : If use table JOIN, you have to keep in mind that the joined column has to be index but if use AS, there is no need to consider this issue 9. What is the maximum string limit for *query_sql Since query_sql sending the query as a string, we can actually use string manipulation script commands such as *sprintf and *implode Example : *sprintf Example : *implode So, someone might ask, what is the string limit for query_sql until the map-server show error ? The answer is very surprising ... I just tested with above script, and it still works perfectly fine ! loop -> 64.210 seconds query -> 3.229 seconds it means, ahh .... or maybe ... The answer might be ... [SQL]: DB error - MySQL server has gone away [Debug]: showmsg: dynamic buffer used, increase the static buffer size to 4306185 or more. until MySQL stop responding XD 9a. UNION Just now the *implode example, it just shows the `mvp_id`, but if we want to display the information like this, +--------+------------------+------------+-----------------------+ | MVP_ID | MVP_NAME | DropCardid | MVP_CARD_NAME | +--------+------------------+------------+-----------------------+ | 1086 | Golden Thief Bug | 4128 | Golden Thiefbug Card | | 1115 | Eddga | 4123 | Eddga Card | | 1150 | Moonlight Flower | 4131 | Moonlight Flower Card | for ( .@i = 0; .@i < .@size; ++.@i ) .@values$[.@i] = "( "+ .@mvpid[.@i] +", (SELECT `kname` FROM `mob_db` WHERE ID = "+ .@mvpid[.@i] +"), (SELECT `DropCardid` FROM `mob_db` WHERE ID = "+ .@mvpid[.@i] +"), (SELECT `item_db`.`name_japanese` FROM `item_db` LEFT JOIN `mob_db` ON `item_db`.`id` = `mob_db`.`DropCardid` WHERE `mob_db`.`ID` = "+ .@mvpid[.@i] +") )"; query_sql "INSERT IGNORE INTO `mvp_table` VALUES "+ implode( .@values$, ", " ); This part ... can be optimize with UNION for ( .@i = 0; .@i < .@size; ++.@i ) .@values$[.@i] = "SELECT "+ .@mvpid[.@i] +", `kname`, `DropCardid` AS `MVP_CARD`, (SELECT `name_japanese` FROM `item_db` WHERE `id` = `MVP_CARD`) FROM `mob_db` WHERE ID = "+ .@mvpid[.@i]; query_sql "INSERT IGNORE INTO `mvp_table` "+ implode( .@values$, " UNION " ); DONE ---- FINALLY !! Yes, I knew the chapter 5 and beyond is very tough to understand ... it also took me longer time to write and test all these advance SQL techniques too Anyway, this topic is now open to Suggestions, Ideas, Improvements, and Questions ~ You may also post up your tricks if you want to share with us
    1 point
  5. Here it is the last one I did for now, just 4 more to go!! This one is the Kafra from Juno. Hope you like it.
    1 point
  6. Hi! ? These are some more of my sprites. Hope you like it ? Job Sprites Job Sprite for a farm system. They do not contain the attack frames. Job Sprite based on the characters Natsu and Lucy from the anime fairy tail.
    1 point
  7. Hii! Some time ago I finally finished the second version that I had promised of this map in the section of Projects and Concepts in Progress: This is also my second map ever finished x3 The first version was made in September of 2018, but one of these is a slightly revisited version of that older one, and the second one has certain parts of the public area changed :3 Note: I'm using some of the screenies from that post to avoid uploading unnecessarily, since the map looks the same essentially ☆★☆Previews☆★☆ Path to the Gods ver. This is the first version with some fixes. This area looks more "simple" than the second one, as the idea is that this place is "sacred", unlike the second one. Path to Glory ver. This is the second version. This is more like a true colosseum, with banners and even an ornated place from where the royalty or rulers can oversee the battle below. - The areas for the public are walkable, in case someone wants to add NPCs as spectators or wants to use those areas otherwise. - The fighting areas of both versions are almost exactly the same except for one tiny detail, but the difference is mostly aesthetic. - Oh and I really enjoyed working on this map! I took so long to showcase it because I was working on other maps, projects and irl, and I wanted it to be perfect, and because I had said that it was going to have these two versions. - There will definitely be a third version of this map that will vary much, much more from these two (and it will definitely not take one year to appear x.x). I hope you like it!
    1 point
  8. Version 1.2.5

    10950 downloads

    Heya, This tool is an action file editor, it edits Act and Spr files. You will find similarities with ActOR in its design, but it should be much more enjoyable to edit animations ;]. Special thanks to Nebraskka for testing this software in its early days. All the suggestions and feedbacks made this software much better. How to install Download the zip archive provided from the download link at the bottom of this description or directly from there : http://www.mediafire.com/file/uoymx2vni249mlu Install the application with Act Editor Installer.exe; if you are missing a .NET Framework you will be prompted to download it. Once you are done, you can start the program from the link on your desktop. Key features The software has many, many features available. It would take too long to describe each one of them, so I've only focussed on the more impotant ones. You can undo and redo everything, scripts included. You can edit and add sounds easily. Powerful and easy to use palette editor. Sprite types have been abstracted - you don't have to worry or care about that. Animation speed can be changed easily. Most components have a drag and drop feature. Advanced scripting engine (C# language). The scripts can also be used to customize the software menus. Error checking when saving the act/spr to avoid invalid files. The sprite version will be automatically downgraded if RLE compression is not available. Frame interpolation (inbetweening/tweening) is possible via the Animation menu. Prompts you with an image converter dialog if the added image is invalid. Allows advanced edition for actions and frames via their respective menus. You can load files from GRFs directly (and save in the GRFs directly as well). Technical stuff Requires .Net Framework 3.5 (SP1) Client Profile to run (3.5 or more will work as well). When prompted with an error, use the "Copy exception" button to copy the debugging info. I will need this to fix the issue you're encountering. The editor's primary window The interface is really straightforward and similar to ActOR. I'll only focus on new elements! Rendering mode : This option changes the behavior of how layers are rendered. If you use 'Editor', you'll clearly see all the pixels when zooming in. If you use 'Ingame', it will use a linear scaling instead, which is closer to what the client does. References : These allow you to know where your item will be positionned (the yellow marker is the anchor, see below). Color mask : To edit the color of a layer, simply click on the color rectangle. You can also drag and drop the colors between different layers to quickly modify many of them. Common shortcuts : You can manipulate layers by using common shortcuts. More can be found from the Edit menu. These below are only the primary ones. Ctrl-A : Select all layers. Ctrl-C : Copy the selected layers. Ctrl-V : Paste the copied layers. Ctrl-X : Cut the selected layers. Alt-C : Copy current action. Alt-V : Paste current action. Advanced action and frame editions These expose all the available methods of the editor. You can remove a range of frames or copy a frame 10 times very quickly and easily. This dialog is found in Action/Frame > Advanced edit... Anchors You can edit anchors from the editor directly. Anchors are points that connect frames together, from different act files. Here's an example without and with anchors : This is mostly useful when you're using reference sprites (on the right panel). Clicking on the anchor button will let you choose where to attach the sprite (this is set semi-automatically for you though). You can edit those from the Anchors menu, but it is recommended to start from a pre-existing act to avoid doing this tedious process. Palette editor The palette editor allows you to quickly recolor sprites with an intuitive interface. Only indexed images can be edited (it's a palette editor after all) and three modes are available. The gradient mode changes an existing gradient to another color while keeping the original saturation and brightness of the colors - this makes the gradients blend in better. If there are no gradient (usually because it's a custom sprite), there's always the Adjust color mode. This one changes all color from a specified range to another one (Photoshop has a similar feature, which does work better). You can click on the image (on the left) to automatically select the palette indexes. These will be highlighted for a few seconds to show you what you're about to edit. Interpolation (tweening) This script can be accessed via Animation > Interpolate frames. This process fills the images between two frames by detecting the changes applied to the layers. Here's a simple example of how it can be used : Script engine The script engine can be accessed via Scripts > Script Runner. This is a big feature of Act Editor, it allows you to automate all your work with the act and much more. Click on the Help button for guides and available methods (don't hesitate to try out a script; if an error occurs the act will be reversed to its previous state). The documentation doesn't cover all of the available options and methods for obvious reasons (the .net framework is huge). Doc example : The language used by the script engine is C#. If you're not familiar with it, simply check out the script samples (Scripts > Open scripts folder)! I won't go into details here, questions can be asked in the support thread regarding addiotional features and methods. If you believe your script should be added in the program, send it to me and I'll probably add it. Customizable The settings dialog allows you to modify all colors in the editor easily. You'll also find the sound resources (GRFs and folders) that can be set up in the Sound tab. The Shell integration tab can associate the .act files with the software to edit them more easily. Don't hesitate to give me a feedbacks or suggestions!
    Free
    1 point
  9. hi everyone i never post, but ever read and learn i can't speak a lot of english, so excuse me >_< i work in customizations of every system in ragnarok, and this is my last job i noticed that is posible to add more maps and locations in the new world map interface (2014 and upper exe only). so, i did this: and this I have deciphered the entire system, so I know how to add all the maps and locations that I want soon, more pictures and information anyone interested? PS: for testing, i use the existing configurations from other maps and the image of "arsinoe" continent
    1 point
×
×
  • Create New...