Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 03/27/24 in all areas

  1. 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
  2. Froggo Rö Folder This is a simple RO folder that contains everything you need to run a 2022-04-06 client, the latest publicly available. I have cleaned and compressed the data.grf file to reduce its size from 3.87GB to 2.15GB. official_data.grf took the same treatment and the file size went down to 426MB. Additionally, I have added a mini-map to all those maps that were lacking one, approximately 275 mini-maps were added, I only ignored some indoor (_in) and guild castles maps. Before BGM, the Rö folder has a total size of 2.62GB, after BGM it reaches 2.96GB Screenshots Requirements Server Up & Running with ‎‏‏‎ PACKETVER=20220406 Visual C++ Redistributables DirectX Runtime Features Includes latest RoEnglishRE - 16/mar/2024 Custom Lua Support jRO Enchantment Display Includes rsu-kro-rag-lite (kRO updater) - v4.2.2.1316 Includes opensetup - v3.1.0.627 Includes iRO's Setup.exe, thanks to relzz! Includes AzzyAI 1.55 Includes Packet Viewer Download click here to download a .zip file of this ro-folder Extra Warp Profile for 2022-04-06 used for FroggoClient.exe (mirror) 2022-04-06 Vanilla Ragexe Client Login Screen Creator Official Ragnarok Complete Installer (08/Jan/2024)(mirror) Froggö Ro Folder Gitlab's Repo FAQ Why am I getting CHARACTER_INFO size error when trying to log in? Possible reasons: You are using outdated rAthena which doesn't work with 2022-04-06 client. You haven't set correct PACKETVER or done it with mistakes (skill issue ). You haven't recompiled rAthena. You haven't restarted server after recompilation. Why am I getting errors about MSVCP140.dll, VCRUNTIME140.dll when executing FroggoClient.exe? You haven't installed Visual C++ Redist, check requirements section, if problem persists, try installing this too Visual C++ Redist for VS 2012u4 What is official_data.grf ? official_data.grf is from the ROResourceCollection project, which brings many items, mobs and npc files from other RO Regions and merges it into one convenient grf. Why does the Setup.exe opens instead of the FroggoClient.exe? In your Windows registry there is no data about your selected graphic card, to fix it, just set up your settings in Setup.exe and click on OK, be aware to don't select DirectX9, stay on DirectX7 What was removed from the data.grf? Several unnecessary files were removed from the data.grf . These included residual files such as thumbs.db and stray BMP Screenshots. However, the majority of the cleanup was performed in the mob and npc sprite folders. In these folders, some .spr files contained sprites (images) that were not utilized in their corresponding .act files. For example, the monster katrinn's .spr file contained approximately 140 images, but only 6 of them were actually used. In total, out of nearly 90,000 collective images, around 9,400 were removed alv.
    1 point
  3. I'm developing a server based on a game called Harvest Moon. Conclude the Farm system, it will accept trees, vegetables and animals. What do you think? Any suggestions? Content of the video in Portuguese.
    1 point
  4. War Declaration System A system which allows guild leaders to declare a war against other guilds. You can only start attacking opposing guild when both guilds will declare each other as enemies. There will be an announcement when guild leaders sets a guild as an antagonist and another announcement saying that both guilds have agreed to declare war on each other. Once both guilds declared war, they can attack each other outside PVP, GvG, BG, Castle Maps, and Towns.. meaning on fields/dungeons only. This should add up some spice on guild vs guild match ups on a server. I'm open for some suggestions for improvement of this system! Cheers! [ Video: ]
    1 point
  5. There are two methods for doing that: Once you have the current frame, click on: Then add the name of the file, like "test.wav". The file should be in data\wav\test.wav You can add a bunch of sound names by editing the list instead: Then select the sound for the frame from the list. If the sound doesn't play when testing the sprite, then it's just because it wasn't found in the resources. That's not really important, but you can add more resources from File > Settings > Sound:
    1 point
  6. Built-in archive support in windows is a joke, it has never been good. Use 7-zip (free) or equivalent software to extract !
    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. *** No longer need file. Found it in older version of rAthena. Bottom of post requests upvote if anyone is interested in a complete rewrite of this mod. If no response, Ill just make a small version for myself. Otherwise, if I see interest, Ill rewrite new version and also include new monsters too. *** Hey all. Sorry for the necro post, but I feel this is the only way I'm hopefully going to get a reply with the file I need. I need a copy of the full version of the old rAthena pet_db.txt in tact. All the above files in this pack are lacking this important information. The pet system has since been revamped where several of the above files are no longer needed as the info now exists in the pet db itself. This means there is no way to merge the several files into a working new pet db and I will have to research every pet in order to make sure they have the proper skills. Would look funny bringing a pet lunatic to a level 100+ dungeon, and have it use a skill that clears the entire screen with vermilion, which I sort of did for fun with a succumbus. Anyway, I need a full copy of the old pet_db.txt file which shows the break down of what each part means. In turn I will make a new pet data base file for both server and client to just copy over and use. Being I have 627 to convert, and as you know Im an avid typer, if I get this file, it should take me a month to write, may be 2 to include new monsters. I can be found on discord, so feel free to dm me if you have this file. Please no urls on what ones fathers, sisters, cousins room mate makes in a week please ? PS, please upvote if you want this updated script. I dont want to pour time into a project no one wants. Note: ** project to convert all pets to yml. ** Add evolving to all pets to unlock special skills. ** This one Im debating on, which is pet breeding for unique pets with special skills.
    1 point
×
×
  • Create New...