#Growing & Hatching
#Where an egg goes
When a carried egg is delivered, GrowthService.startGrowth runs. With Features.Base.FREE_PLACEMENT = true the player may place the egg anywhere inside their base region, up to Features.Base.MAX_GROWING = 12 eggs at once and MAX_REACH = 70 studs from the base centre. Placement respects MIN_SPACING = 5 and EDGE_INSET = 2.5, and Config.Plot.REQUIRE_PRESENCE_TO_PLACE = true means the player must be standing there.
Turn free placement off and the slot system returns: Config.Plot.GROWTH_SLOTS = 6 slots spaced 7 studs apart, with legacy slot coordinates converted on load by PlotService.legacySlotLocal.
#Grow time
Duration comes from the pet's catalog entry:
duration = max(GrowthService.MIN_GROW_SECONDS, egg.growSeconds / growthMul)
egg.growSecondsis theWikiPetsoverride when present, otherwiseConfig.RarityGrowSeconds[rarity].growthMulis the runtime multiplier: 2 with theDoubleGrowthpass, andFeatures.DayNight.HATCH_SPEED_MUL = 30during the night window.GrowthService.MIN_GROW_SECONDS = 10, so even a heavily boosted egg still takes ten seconds.- The tutorial's first egg ignores the table and uses
Config.Tutorial.FIRST_EGG_GROW_SECONDS = 3.
| Rarity | Default grow seconds |
|---|---|
| Common | 30 |
| Uncommon | 60 |
| Rare | 120 |
| Epic | 240 |
| Legendary | 480 |
| Mythic | 900 |
| Cosmic | 1,500 |
| Secret | 2,400 |
| Eternal | 3,600 |
| Divine | 5,400 |
| Event | 1,200 |
#Visual growth
The egg passes through three visual stages (GROW_STAGES = { 1.0, 1.5, 2.0 }) at thirds of its timer, animating with a back-out ease over 0.25 s. A billboard above the egg reads Egg with a countdown such as 2h 59m, switching to READY! when the timer expires; the hatch prompt stays disabled until then. After every scale change the model is re-seated on the ground so it never sinks into the base.
#Grow All
growAll finishes every running timer at once:
- the first use inside each
Config.Economy.GROW_ALL_FREE_COOLDOWNwindow (600 seconds) is free; - after that the price is
remainingSeconds × Config.Economy.GROW_ALL_PRICE_PER_SECOND(2 cash per second), charged throughEconomyService.spend.
#Selling instead of hatching
GrowthService.sellValue pays baseIncome × weightMul × 45 (minimum 1 cash) for any egg — growing or stored in the inventory. The Sell Center shows growing and inventory eggs on the same Eggs tab, and sellAllEggs clears both.
#Hatching
Hatching is a ProximityPrompt named HatchEgg on the egg: E, one-second hold, 14 studs of activation distance, and only the owner can trigger it (SAE_OwnerUserId).
The server then:
- rolls the mutation —
entry.forcedMutationorMutationService.rollNaturalMutation, - builds the pet with
MutationService.createPetand marks ithatching, - clears the growing entry and increments
stats.totalHatched, - registers the discovery with
IndexService.register, - runs the ceremony: three shakes, a shatter into physical neon shards, the pet growing in place, then a quadratic flight to the player where it shrinks out,
- hands the pet to the inventory and pushes
hatchResultto the client for the hatch sound.
HatchService.SkipCeremony = true skips the animation; the test harness sets it. The ceremony runs inside pcall, so a failed animation still delivers the pet.