Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 04/16/23 in all areas

  1. Version 1.0.1

    487 downloads

    Sunken Tower instance with infinite floors. The mob scaling is using custom values as I don't know how it is in kRO. Currently, the additional exp scaling and mob ATK scaling does not work without changing the source code. I will not be providing support for that.
    Free
    2 points
  2. This is not tested under renewal. I think it should still work, but test it with a GM character first. The default implementation of Homunculi is kind of obnoxious. When you create one, you get one of the homunculi at random, and in order to get another one, you have to completely delete them from existence. Wouldn't it be nice if you could keep the other homunculi to use later? Well, now you can! What it does: - When you use rest, the Homunculus returns to its Embyro. - You can use Call Homunculus to call it back out, just as it was when you rested it. - You can store the Homunculus for later use, allowing you to raise a different Homunculus, which is not normally possible. - Only you can call the Homunculus back out. If another alchemist tries to call it, it doesn't let them. - You can still delete the Homunculi as normal to remove them from existence completely. How it works from a technical perspective: - When you rest the homunculus, it is technically "removed" from you, similar to deleting it, but it returns an embyro with the Homunculus id set to its card[1] slot. - When you call out a Homunculus from an Embyro, if the embyro has a value in its card[1] slot, it restores that Homunculus instead of creating a new one. Some minor limitations: - It's not possible to distinguish embryos from each other, and call homunculus will always try to call the first one it finds in your inventory. You'll need to store the ones you don't want to raise right now, and it may take some trial and error to hatch the right one if you have a bunch. - The name display of the embryo doesn't work with the client I have (it seems like the client will only display the name if the card[1] slot is 0, which it's not if a homunculus is in there). This makes it hard to tell who owns a homunculus embyro. How to implement: Make the following code changes: In homunculus.cpp: Find the method "hom_vaporize": First, add the following variable declarations to the top, under the existing ones: int itemflag; struct item tmp_item; Next, comment out the following line: hd->homunculus.vaporize = flag ? flag : HOM_ST_REST; Then, insert the following at the end of the method, just before the return statement. if (hd->homunculus.intimacy > 0) { memset(&tmp_item, 0, sizeof(tmp_item)); tmp_item.nameid = 7142; tmp_item.amount = 1; tmp_item.identify = 1; tmp_item.card[0] = CARD0_CREATE; tmp_item.card[1] = hd->homunculus.hom_id; tmp_item.card[2] = GetWord(sd->status.char_id, 0); // CharId tmp_item.card[3] = GetWord(sd->status.char_id, 1); if ((itemflag = pc_additem(sd, &tmp_item, tmp_item.amount, LOG_TYPE_PRODUCE))) { clif_additem(sd, 0, 0, itemflag); if (battle_config.skill_drop_items_full) { map_addflooritem(&tmp_item, tmp_item.amount, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0, 0); } } unit_remove_map(&hd->bl, CLR_OUTSIGHT); sd->status.hom_id = 0; unit_free(&hd->bl, CLR_OUTSIGHT); sd->hd = 0; return 1; } Next, find the method "hom_call": Find this code: if (!sd->status.hom_id) //Create a new homun. return hom_create_request(sd, HM_CLASS_BASE + rnd_value(0, 7)) ; Replace it with this: struct item ed; int n; // find the embryo if (!sd->status.hom_id) { //Create or revive a homun. if ((n = pc_search_inventory(sd, 7142)) >= 0) { ed = sd->inventory.u.items_inventory[n]; } else { return false; // no embryo } if (ed.card[1] != 0) { // is it ours? if (sd->status.char_id == MakeDWord(ed.card[2], ed.card[3])) { // revive the homun // delete the embryo pc_delitem(sd, n, 1, 0, 0, LOG_TYPE_CONSUME); sd->status.hom_id = ed.card[1]; // proceed with rest of function } else { // Cannot revive someone else's homunculus return false; } } else { // create a new homun // delete the embryo pc_delitem(sd, n, 1, 0, 0, LOG_TYPE_CONSUME); return hom_create_request(sd, HM_CLASS_BASE + rnd_value(0, 7)); } } Almost done, just one small change to make in skill.cpp. Find this line: if (sd->status.hom_id) //Don't delete items when hom is already out. And comment it out (we never want this method to delete the embyros, since the call method now handles it). Now just recompile your server and you should have the new homunculus behaviour.
    1 point
  3. Looks like they've changed a couple small things in the code compared to the version I have, I remember why I posted it the way I did the first time now. These kinds of errors typically occur when a method signature has changed, so you just need to swap the affected code with whatever they have in the base version. To fix the first error, in hom_vamporize, find this: if (battle_config.hom_setting&HOMSET_RESET_REUSESKILL_VAPORIZED) memset(hd->blockskill, 0, sizeof(hd->blockskill)); and change it to this: if (battle_config.hom_setting&HOMSET_RESET_REUSESKILL_VAPORIZED) { hd->blockskill.clear(); hd->blockskill.shrink_to_fit(); } For the second, find this in hom_call: if (battle_config.hom_setting&HOMSET_COPY_SPEED) status_calc_bl(&hd->bl, SCB_SPEED); and change it to this: if (battle_config.hom_setting&HOMSET_COPY_SPEED) status_calc_bl(&hd->bl, { SCB_SPEED }); By the way, my version of hom_call is also missing this at the end, as it predates the update where this was done: #ifdef RENEWAL sc_start(&sd->bl, &sd->bl, SC_HOMUN_TIME, 100, 1, skill_get_time(AM_CALLHOMUN, 1)); #endif And similarly this is in hom_vaporize: #ifdef RENEWAL status_change_end(&sd->bl, SC_HOMUN_TIME); #endif You can add this back in if you want (these are responsible for the Homunculi lasting only a certain amount of time). I don't know if this plays nicely with this mod, though.
    1 point
  4. At first, holy awesome work and thank you very much for sharing. I tried to test it, but I got some errors after compiling. Do I miss something?!
    1 point
  5. and also make sure read the Wiki/guides for it. https://github.com/llchrisll/ROenglishRE
    1 point
  6. CMIW it should be your iteminfo lua or lub file that broken that not having, view id entry.
    1 point
  7. If you've gotten annoyed with the limitation of not being able to see what homunculus is inside the Embryo, I've coded a significantly more complicated version of this change that displays a pet incubator-like dialog and lets you pick the embryo you want to hatch. This is much more complex from a coding perspective though, so you should make sure you're confident in making changes to the codebase. Any embryos made with the old version of the mod will still work, but you'll have to hatch and rest them to convert them to their named versions. This will also require you to distribute a new version of iteminfo.lub. First, you need to add a new method to clif.hpp: void clif_sendembryo(struct map_session_data* sd); Next, you need to add the code for this method to clif.cpp: /// Presents a list of embyros that can be revived /// 01a6 <packet len>.W { <index>.W }* void clif_sendembryo(struct map_session_data* sd) { int i, n = 0, fd; nullpo_retv(sd); fd = sd->fd; WFIFOHEAD(fd, MAX_INVENTORY * 2 + 4); WFIFOW(fd, 0) = 0x1a6; for (i = 0, n = 0; i < MAX_INVENTORY; i++) { if (sd->inventory.u.items_inventory[i].nameid <= 0 || sd->inventory_data[i] == NULL || (sd->inventory_data[i]->nameid != 7142 && !(sd->inventory_data[i]->nameid >= 9901 && sd->inventory_data[i]->nameid <= 9909)) || sd->inventory.u.items_inventory[i].amount <= 0) continue; WFIFOW(fd, n * 2 + 4) = i + 2; n++; } WFIFOW(fd, 2) = 4 + n * 2; WFIFOSET(fd, WFIFOW(fd, 2)); sd->menuskill_id = AM_CALLHOMUN; sd->menuskill_val = -1; } There's also a change needed in clif.cpp: Find the method clif_parse_SelectEgg and replace it with this: /// Answer to pet incubator egg selection dialog (CZ_SELECT_PETEGG). /// 01a7 <index>.W void clif_parse_SelectEgg(int fd, struct map_session_data* sd) { if (sd->menuskill_val != -1) return; if (sd->menuskill_id == SA_TAMINGMONSTER) { pet_select_egg(sd, RFIFOW(fd, packet_db[RFIFOW(fd, 0)].pos[0]) - 2); clif_menuskill_clear(sd); } if (sd->menuskill_id == AM_CALLHOMUN) { hom_call(sd, RFIFOW(fd, packet_db[RFIFOW(fd, 0)].pos[0]) - 2); if (sd->pd) clif_send_petstatus(sd); // the client wipes the pet status upon answering this dialog, so it has to be resent. clif_menuskill_clear(sd); } } Now we need to change homunculus.hpp. Find the definition for hom_call and change it to this: bool hom_call(struct map_session_data *sd, short hom_index); Now in homunculus.cpp: Replace the hom_call method with this: /** * Make a player spawn a homonculus (call) * @param sd * @param hom_index * @return False:failure, True:sucess */ bool hom_call(struct map_session_data* sd, short hom_index) { struct homun_data* hd; struct item ed; int n; if (hom_index < 0 || hom_index >= MAX_INVENTORY) return 0; //Forged packet! // find the embryo if (!sd->status.hom_id) { //Create or revive a homun. if (sd->inventory.u.items_inventory[hom_index].nameid == 7142 || sd->inventory.u.items_inventory[hom_index].nameid >= 9901 && sd->inventory.u.items_inventory[hom_index].nameid <= 9909) n = hom_index; else { ShowError("wrong embryo item inventory %d\n", hom_index); return false; } ed = sd->inventory.u.items_inventory[n]; if (ed.card[1] != 0) { // is it ours? if (sd->status.char_id == MakeDWord(ed.card[2], ed.card[3])) { // revive the homun // delete the embryo pc_delitem(sd, n, 1, 0, 0, LOG_TYPE_CONSUME); sd->status.hom_id = ed.card[1]; // proceed with rest of function } else { // Cannot revive someone else's homunculus return false; } } else { // create a new homun // delete the embryo pc_delitem(sd, n, 1, 0, 0, LOG_TYPE_CONSUME); return hom_create_request(sd, HM_CLASS_BASE + rnd_value(0, 7)); } } // If homunc not yet loaded, load it if (!sd->hd) return intif_homunculus_requestload(sd->status.account_id, sd->status.hom_id); hd = sd->hd; if (!hd->homunculus.vaporize) return false; //Can't use this if homun wasn't vaporized. if (hd->homunculus.vaporize == HOM_ST_MORPH) return false; // Can't call homunculus (morph state). hom_init_timers(hd); hd->homunculus.vaporize = HOM_ST_ACTIVE; if (hd->bl.prev == NULL) { //Spawn him hd->bl.x = sd->bl.x; hd->bl.y = sd->bl.y; hd->bl.m = sd->bl.m; if(map_addblock(&hd->bl)) return false; clif_spawn(&hd->bl); clif_send_homdata(sd,SP_ACK,0); clif_hominfo(sd,hd,1); clif_hominfo(sd,hd,0); // send this x2. dunno why, but kRO does that [blackhole89] clif_homskillinfoblock(sd); if (battle_config.hom_setting&HOMSET_COPY_SPEED) status_calc_bl(&hd->bl, SCB_SPEED); hom_save(hd); } else //Warp him to master. unit_warp(&hd->bl,sd->bl.m, sd->bl.x, sd->bl.y,CLR_OUTSIGHT); return true; } Also replace the hom_vaporize method with this: /** * Vaporize a character's homunculus * @param sd * @param flag 1: then HP needs to be 80% or above. 2: then set to morph state. */ int hom_vaporize(struct map_session_data *sd, int flag) { struct homun_data *hd; int itemflag; struct item tmp_item; nullpo_ret(sd); hd = sd->hd; if (!hd || hd->homunculus.vaporize) return 0; if (status_isdead(&hd->bl)) return 0; //Can't vaporize a dead homun. if (flag == HOM_ST_REST && get_percentage(hd->battle_status.hp, hd->battle_status.max_hp) < 80) return 0; hd->regen.state.block = 3; //Block regen while vaporized. //Delete timers when vaporized. hom_hungry_timer_delete(hd); //hd->homunculus.vaporize = flag ? flag : HOM_ST_REST; if (battle_config.hom_setting&HOMSET_RESET_REUSESKILL_VAPORIZED) memset(hd->blockskill, 0, sizeof(hd->blockskill)); clif_hominfo(sd, sd->hd, 0); hom_save(hd); if (hd->homunculus.intimacy > 0) { memset(&tmp_item, 0, sizeof(tmp_item)); switch (hom_class2mapid(hd->homunculus.class_)) { case MAPID_LIF: case MAPID_LIF_E: tmp_item.nameid = 9901; break; case MAPID_AMISTR: case MAPID_AMISTR_E: tmp_item.nameid = 9902; break; case MAPID_FILIR: case MAPID_FILIR_E: tmp_item.nameid = 9903; break; case MAPID_VANILMIRTH: case MAPID_VANILMIRTH_E: tmp_item.nameid = 9904; break; case MAPID_EIRA: tmp_item.nameid = 9905; break; case MAPID_BAYERI: tmp_item.nameid = 9906; break; case MAPID_SERA: tmp_item.nameid = 9907; break; case MAPID_DIETER: tmp_item.nameid = 9908; break; case MAPID_ELANOR: tmp_item.nameid = 9909; break; } tmp_item.amount = 1; tmp_item.identify = 1; tmp_item.card[0] = CARD0_CREATE; tmp_item.card[1] = hd->homunculus.hom_id; tmp_item.card[2] = GetWord(sd->status.char_id, 0); // CharId tmp_item.card[3] = GetWord(sd->status.char_id, 1); if ((itemflag = pc_additem(sd, &tmp_item, tmp_item.amount, LOG_TYPE_PRODUCE))) { clif_additem(sd, 0, 0, itemflag); if (battle_config.skill_drop_items_full) { map_addflooritem(&tmp_item, tmp_item.amount, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0, 0); } } unit_remove_map(&hd->bl, CLR_OUTSIGHT); sd->status.hom_id = 0; unit_free(&hd->bl, CLR_OUTSIGHT); sd->hd = 0; return 1; } return unit_remove_map(&hd->bl, CLR_OUTSIGHT); } Getting there, we now need to make a couple changes to skill.cpp: As with the first version of this process, comment out this line: (If you already implemented the first version this will be done already) if (sd->status.hom_id) //Don't delete items when hom is already out. Now find this code block: case AM_CALLHOMUN: //[orn] if (sd && !hom_call(sd)) clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); break; And replace it with this: case AM_CALLHOMUN: if (sd && !sd->status.hom_id) { clif_sendembryo(sd); clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); } else if (sd && !hom_call(sd, 0)) { clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); } break; Now, find this line in script.cpp: hom_call(sd); // Respawn homunculus. and replace it with this: hom_call(sd, 0); // Respawn homunculus. Phew! Done with code changes! Now we just need to add the new embryos into the item-db (for a fun challenge, see if you can determine what their item ids are from the code before we proceed further). If you have the old, text based item-db, you need to add this: 9901,Lif_Embryo,Lif Embryo,3,10,,10,,,,,,,,,,,,,{},{},{} 9902,Amistr_Embryo,Amistr Embryo,3,10,,10,,,,,,,,,,,,,{},{},{} 9903,Filir_Embryo,Filir Embryo,3,10,,10,,,,,,,,,,,,,{},{},{} 9904,Vanilmirth_Embryo,Vanilmirth Embryo,3,10,,10,,,,,,,,,,,,,{},{},{} 9905,Eira_Embryo,Eira Embryo,3,10,,10,,,,,,,,,,,,,{},{},{} 9906,Bayeri_Embryo,Bayeri Embryo,3,10,,10,,,,,,,,,,,,,{},{},{} 9907,Sera_Embryo,Sera Embryo,3,10,,10,,,,,,,,,,,,,{},{},{} 9908,Dieter_Embryo,Dieter Embryo,3,10,,10,,,,,,,,,,,,,{},{},{} 9909,Eleanor_Embryo,Eleanor Embryo,3,10,,10,,,,,,,,,,,,,{},{},{} If you have the new, yaml-based item-db, you need to add this to item-db-etc.yml - Id: 9901 AegisName: Lif_Embryo Name: Lif Embryo Type: Etc Buy: 10 Weight: 10 - Id: 9902 AegisName: Amistr_Embryo Name: Amistr Embryo Type: Etc Buy: 10 Weight: 10 - Id: 9903 AegisName: Filir_Embryo Name: Filir Embryo Type: Etc Buy: 10 Weight: 10 - Id: 9904 AegisName: Vanilmirth_Embryo Name: Vanilmirth Embryo Type: Etc Buy: 10 Weight: 10 - Id: 9905 AegisName: Eira_Embryo Name: Eira Embryo Type: Etc Buy: 10 Weight: 10 - Id: 9906 AegisName: Bayeri_Embryo Name: Bayeri Embryo Type: Etc Buy: 10 Weight: 10 - Id: 9907 AegisName: Sera_Embryo Name: Sera Embryo Type: Etc Buy: 10 Weight: 10 - Id: 9908 AegisName: Dieter_Embryo Name: Dieter Embryo Type: Etc Buy: 10 Weight: 10 - Id: 9909 AegisName: Eleanor_Embryo Name: Eleanor Embryo Type: Etc Buy: 10 Weight: 10 Finally, we just need to add the following to iteminfo.lub: [9901] = { unidentifiedDisplayName = "Lif Embryo", unidentifiedResourceName = "¿¥ºê¸®¿À", unidentifiedDescriptionName = { "..." }, identifiedDisplayName = "Lif Embryo", identifiedResourceName = "¿¥ºê¸®¿À", identifiedDescriptionName = { "An embryo containing a Lif.", "^FFFFFF_^000000", "Weight:^009900 1^000000" }, slotCount = 0, ClassNum = 0 }, [9902] = { unidentifiedDisplayName = "Amistr Embryo", unidentifiedResourceName = "¿¥ºê¸®¿À", unidentifiedDescriptionName = { "..." }, identifiedDisplayName = "Amistr Embryo", identifiedResourceName = "¿¥ºê¸®¿À", identifiedDescriptionName = { "An embryo containing an Amistr.", "^FFFFFF_^000000", "Weight:^009900 1^000000" }, slotCount = 0, ClassNum = 0 }, [9903] = { unidentifiedDisplayName = "Filir Embryo", unidentifiedResourceName = "¿¥ºê¸®¿À", unidentifiedDescriptionName = { "..." }, identifiedDisplayName = "Filir Embryo", identifiedResourceName = "¿¥ºê¸®¿À", identifiedDescriptionName = { "An embryo containing a Filir.", "^FFFFFF_^000000", "Weight:^009900 1^000000" }, slotCount = 0, ClassNum = 0 }, [9904] = { unidentifiedDisplayName = "Vanilmirth Embryo", unidentifiedResourceName = "¿¥ºê¸®¿À", unidentifiedDescriptionName = { "..." }, identifiedDisplayName = "Vanilmirth Embryo", identifiedResourceName = "¿¥ºê¸®¿À", identifiedDescriptionName = { "An embryo containing a Vanilmirth.", "^FFFFFF_^000000", "Weight:^009900 1^000000" }, slotCount = 0, ClassNum = 0 }, [9905] = { unidentifiedDisplayName = "Eira Embryo", unidentifiedResourceName = "¿¥ºê¸®¿À", unidentifiedDescriptionName = { "..." }, identifiedDisplayName = "Eira Embryo", identifiedResourceName = "¿¥ºê¸®¿À", identifiedDescriptionName = { "An embryo containing an Eira.", "^FFFFFF_^000000", "Weight:^009900 1^000000" }, slotCount = 0, ClassNum = 0 }, [9906] = { unidentifiedDisplayName = "Bayeri Embryo", unidentifiedResourceName = "¿¥ºê¸®¿À", unidentifiedDescriptionName = { "..." }, identifiedDisplayName = "Bayeri Embryo", identifiedResourceName = "¿¥ºê¸®¿À", identifiedDescriptionName = { "An embryo containing a Bayeri.", "^FFFFFF_^000000", "Weight:^009900 1^000000" }, slotCount = 0, ClassNum = 0 }, [9907] = { unidentifiedDisplayName = "Sera Embryo", unidentifiedResourceName = "¿¥ºê¸®¿À", unidentifiedDescriptionName = { "..." }, identifiedDisplayName = "Sera Embryo", identifiedResourceName = "¿¥ºê¸®¿À", identifiedDescriptionName = { "An embryo containing a Sera.", "^FFFFFF_^000000", "Weight:^009900 1^000000" }, slotCount = 0, ClassNum = 0 }, [9908] = { unidentifiedDisplayName = "Dieter Embryo", unidentifiedResourceName = "¿¥ºê¸®¿À", unidentifiedDescriptionName = { "..." }, identifiedDisplayName = "Dieter Embryo", identifiedResourceName = "¿¥ºê¸®¿À", identifiedDescriptionName = { "An embryo containing a Dieter.", "^FFFFFF_^000000", "Weight:^009900 1^000000" }, slotCount = 0, ClassNum = 0 }, [9909] = { unidentifiedDisplayName = "Eleanor Embryo", unidentifiedResourceName = "¿¥ºê¸®¿À", unidentifiedDescriptionName = { "..." }, identifiedDisplayName = "Eleanor Embryo", identifiedResourceName = "¿¥ºê¸®¿À", identifiedDescriptionName = { "An embryo containing an Eleanor.", "^FFFFFF_^000000", "Weight:^009900 1^000000" }, slotCount = 0, ClassNum = 0 }, And that should be everything! Now just recompile the codebase and restart the server and you should have the new homunculus behaviour. Hopefully I didn't miss anything in the steps.
    1 point
  8. Problem solved, thank you very much for answering! in agit_main line 1133 OnClock0001: the time to display the chests is modified, once the economy is at 100% ?
    1 point
  9. I found this from rAthena Discord. Answer by Fluxion: Hope this can help you.
    1 point
  10. Version 1.1.0

    942 downloads

    Compendium - A levelable battle pass inspired majority of games out there. Feature : Easy customizable settings. Three types of selectable daily quest. Daily quest requirements are randomized. Daily quest count resets everyday. Compendium resets on the first day of the month. Rewards are sent via mail. '@compendium' command to access the compendium Settings : Adding a reward on the compendium Rewards : "Level | Reward ID, Amount, Reward ID, Amount,... ==| Level order doesn't matter but 'duplicates' will bug out the script. setarray .compendium_reward$, "1|501:10,502:20", "10|501:20,502:30", "5|501:100,502:500"; Adding a monster/item/mvp to hunt or collect Just add the ID on the following line. setarray .mvp_list setarray .hunt_list setarray .gather_list Changing EXP given on the quest types. .gathering_exp = 50; .hunt_exp = 50; .mvp_hunt_exp = 100;
    Free
    1 point
  11. it seems that base on your error feed from console it is clear that you has a invalid item or the array start's on -1? maybe?
    1 point
  12. Version 2.2.0

    40722 downloads

    Third Job Costumes + New Classes The Correction With the advent of jRO releasing new Job Costumes, and also, the new classes from the Taekwon branch, many of server owners want to replace the vanilla sprites or even, implement the bodystyle system. But, there's a catch! Originally jRO, and now, even kRO spriters, have made it completely off of the default pattern of palette. In a classic example, you can notice the pattern of the RO palettes. What matters is the position of the colours, as an example, for all jobs, the white-ish tones will be always on the same row, so we can use it to create custom palettes. See how it works: But jRO didn't follow the classic pattern, making it incompatible with custom palettes (@Kamishi ones included). So, I edited frame by frame of each job sprite, of each gender, mounted or not, correcting them, converting them in a way so many of the previously created palettes will work. This package includes: Alternate Outfits: Alternate Royal Guard M/F + Gryffon Battlemount + Lion Mount Alternate Ranger M/F + Warg Battlemount + Ostrich Mount Alternate Minstrel/Wanderer + Ostrich Mount Alternate ArchBishop M/F + Alpaca Mount Alternate Warlock M/F + Fox Mount Alternate Mechanic M/F + Savage Mount Alternate Genetic M/F + Savage Mount Alternate Guillotine Cross M/F + Hyena Mount Alternate Shadow Chaser M/F + Hyena Mount Alternate Sorcerer M/F + Fox Mount Alternate Sura M/F + Alpaca Mount Alternate Rune Knight M/F + Dragon Battlemount + Lion Mount New Classes Star Emperor M/F + Wolf Mount Soul Reaper M/F + Wolf Mount As requested by @Emistry, I also added an extra, making it more compatible to default palettes: Kagerou/Oboro + Frog Mount Following the another @Emistry's request, all files are now already on GRFs. The previous version had no Cashmount palette included, this one fixes the issue. Only the already released costumes are supported at this moment. The Rune Knight seems to be the last of them, it's over a year from the first release! As a final part of the package, I'm including Classic Palettes for all Alternate Costumes. Enjoy the final product!
    Free
    1 point
×
×
  • Create New...