Custom Pets Guide
Custom Pets Guide
Section titled “Custom Pets Guide”Add your own pets, combat companions, and mounts without touching any code. All you need is a JSON file.
How It Works
Section titled “How It Works”The Pets mod auto-discovers all .json files in the pet-types/ subfolders. When it finds a pet type that has no matching item file, it auto-generates the item JSON into the server’s content directory.
:::info Two Restarts Required Due to how Hytale loads items (before plugins start), adding a new pet requires two server restarts:
- First restart — The mod loads your pet type and generates the missing item file
- Second restart — Hytale loads the generated item, and the pet is fully functional
This is a Hytale engine limitation, not a mod limitation. :::
Quick Start
Section titled “Quick Start”1. Find the Templates
Section titled “1. Find the Templates”The mod includes ready-to-use templates in each pet-types subfolder:
plugins/kyuubisoft.pets/pet-types/├── collector/│ └── _template.json ← Pickup Pet template├── combat/│ └── _template.json ← Combat Pet template└── mount/ └── _template.json ← Mount template2. Copy and Rename
Section titled “2. Copy and Rename”Copy the template for the type you want and give it a unique name:
_template.json → phoenix.jsonDo NOT rename _template.json directly — copy it. Files starting with _ are ignored by the mod.
3. Edit the JSON
Section titled “3. Edit the JSON”Open your new file and fill in the values. Here’s what each field means:
4. Restart Twice
Section titled “4. Restart Twice”- Start the server → check the log for
"Generated missing item 'Pet_Egg_Phoenix'" - Restart again → the item is loaded and the pet is ready
- Test with
/kspetadmin give <player> phoenix
Pickup Pet Fields
Section titled “Pickup Pet Fields”| Field | Type | Description |
|---|---|---|
id | string | Unique identifier (lowercase, underscores). Must match filename |
displayName | string | Display name shown to players |
entityTypeId | string | Hytale entity model (e.g. Fox, Bunny, Owl_Snow) |
modelScale | float | Size multiplier (0.5 = half size, 1.0 = normal) |
followDistance | float | How far the pet follows behind the player |
followSpeed | float | Movement speed when following |
pickupRadius | float | Item pickup range in blocks |
maxLevel | int | Maximum level (default: 50) |
baseXpPerLevel | int | XP needed for level 2 |
xpScaleFactor | float | XP curve multiplier per level (1.15 = 15% more per level) |
eggItemId | string | Item ID for the egg (auto-generated if omitted: Pet_Egg_<Id>) |
rarity | string | common, uncommon, rare, epic, or legendary |
description | string | Short description |
Example: Pickup Pet
Section titled “Example: Pickup Pet”{ "id": "phoenix", "displayName": "Baby Phoenix", "entityTypeId": "Skrill_Chick", "modelScale": 0.6, "followDistance": 3.0, "followSpeed": 5.5, "pickupRadius": 2.0, "maxLevel": 50, "baseXpPerLevel": 120, "xpScaleFactor": 1.18, "rarity": "epic", "description": "A fiery phoenix companion that collects items."}Combat Pet Fields
Section titled “Combat Pet Fields”All pickup pet fields plus:
| Field | Type | Description |
|---|---|---|
module | string | Must be "combat" |
runeItemId | string | Item ID for the rune (auto: Battle_Rune_<Id>) |
combatStats.baseDamage | float | Base damage at level 1 |
combatStats.damagePerLevel | float | Additional damage per level |
combatStats.attackSpeed | float | Attacks per second |
combatStats.attackRange | float | Attack range in blocks |
combatStats.aggroRange | float | Detection range for enemies |
combatStats.leashDistance | float | Max distance before returning to owner |
combatStats.attackAnimation | string | Animation name (e.g. Bite, Ram, SwingLeft) |
combatStats.attackAnimationsId | string | Animation set (e.g. Wolf_Black_Default) |
Example: Combat Pet
Section titled “Example: Combat Pet”{ "id": "fire_golem", "displayName": "Fire Golem", "entityTypeId": "Bramblekin", "modelScale": 1.2, "followDistance": 3.0, "followSpeed": 5.0, "maxLevel": 50, "baseXpPerLevel": 140, "xpScaleFactor": 1.15, "rarity": "epic", "description": "A burning golem that fights by your side.", "module": "combat", "combatStats": { "baseDamage": 12.0, "damagePerLevel": 0.7, "attackSpeed": 1.0, "attackRange": 3.0, "aggroRange": 15.0, "leashDistance": 20.0, "attackAnimation": "Bite", "attackAnimationsId": "Bramblekin_Default" }}Mount Fields
Section titled “Mount Fields”All base fields plus:
| Field | Type | Description |
|---|---|---|
module | string | Must be "mount" |
hornItemId | string | Item ID for the horn (auto: Mount_Horn_<Id>) |
mountConfig.mountType | string | "walk", "fly" (WIP), or "swim" (WIP) |
mountConfig.mountYOffset | float | Player seat height on the mount |
mountConfig.speed | float | Movement speed multiplier |
mountConfig.baseHealth | float | Mount health points |
Example: Mount
Section titled “Example: Mount”{ "id": "war_elephant", "displayName": "War Elephant", "entityTypeId": "Bison", "modelScale": 1.5, "maxLevel": 30, "baseXpPerLevel": 180, "xpScaleFactor": 1.2, "rarity": "legendary", "description": "A massive war elephant. Slow but unstoppable.", "module": "mount", "mountConfig": { "mountType": "walk", "mountYOffset": 2.8, "speed": 0.9, "baseHealth": 200 }}Available Entity Types
Section titled “Available Entity Types”Any Hytale entity can be used as a pet model. Common choices:
Small animals (good for pickup pets): Fox, Bunny, Cat, Gecko, Meerkat, Crab, Duck, Penguin, Squirrel, Bat, Parrot, Bluebird, Frog_Green, Owl_Snow, Mouse, Rat
Medium creatures (good for combat pets): Wolf_Black, Boar, Crocodile, Spider, Scorpion, Hyena, Bramblekin, Crawler_Void
Large creatures (good for mounts): Horse, Camel, Bison, Moose_Bull, Bear_Polar, Tiger_Sabertooth, Dragon_Frost, Rex_Cave
Rarity Effects
Section titled “Rarity Effects”| Rarity | Max Stats | Unlock Levels | Quality Range |
|---|---|---|---|
| Uncommon | 2 | 1, 10 | 0% - 70% |
| Rare | 3 | 1, 8, 16 | 0% - 85% |
| Epic | 4 | 1, 6, 12, 20 | 0% - 100% |
| Legendary | 5 | 1, 5, 10, 15, 25 | 0% - 120% |
Higher rarity = more random stat slots, better stat rolls. Legendary pets can exceed the normal maximum stat values (up to 120% of the base maximum).
The common rarity is accepted but has no stat rules defined in the default stat-pool.json. Common pets will have 1 stat with a narrow quality range. For best results, use uncommon or higher.
Troubleshooting
Section titled “Troubleshooting”Pet type not loading
Section titled “Pet type not loading”- Ensure the file is in the correct subfolder (
collector/,combat/, ormount/) - Filename must NOT start with
_ - Validate JSON syntax (no trailing commas, proper brackets)
- Check server logs for loading errors
Item not generating
Section titled “Item not generating”- Check the log for
"Generated missing item"messages - If you see
"Content directory not found", copy the file fromitem-templates/manually - The
eggItemId/runeItemId/hornItemIdmust follow the naming convention (e.g.Pet_Egg_<CamelCase>)
Pet looks wrong
Section titled “Pet looks wrong”- Verify
entityTypeIdmatches a real Hytale entity name (case-sensitive) - Adjust
modelScale— most small pets use 0.5-0.8, mounts use 1.0+
Admin commands for testing
Section titled “Admin commands for testing”/kspetadmin give <player> <pet_id> — Give the pet/kspetadmin list — List all registered types/kspetadmin reload — Reload configs (no restart)