Skip to content

Animals as Ingredient

Achimobil edited this page Oct 7, 2026 · 1 revision

A production point can have its own trigger for livestock trailers. The player drives up with the loaded trailer, stays seated in the vehicle and delivers animals; they become an amount of goods in storage, which a perfectly normal recipe then processes further — this is how a slaughterhouse, for example, is made.

On the player's side, the "Trade animals" permission is required and the production point must belong to the player's own farm.

The <animalTrigger> block

It sits under <productionPoint>, next to <productions> and <storage>.

Attribute Default Meaning
animalTrigger#triggerNode – Shared trigger for all animal inputs of this production point

Below it, one <input> per animal group under <inputs>:

Attribute Default Meaning
animalType – Animal type whose breeds are all accepted (COW, SHEEP, PIG, HORSE, CHICKEN)
animalSubType – A single breed instead of the whole animal type (e.g. SHEEP_LANDRACE), takes precedence over animalType
inputFillType – Required. Fill type the animals are turned into
minHealthFactor 50 Minimum health in percent
maxHealthFactor 100 Maximum health in percent
minAgeMonth 6 Minimum age in months
maxAgeMonth 200 Maximum age in months; the default effectively means "no maximum age"
calculateWeight true Between two weight steps the amount is interpolated evenly; with false it stays the same until the next step
triggerNode the shared one Own trigger for this input only

Any number of <weight> steps per <input>:

Attribute Default Meaning
ageMonth 6 Age in months this value applies to
value 1000 Amount in liters that an animal of this age yields at full health

Contradictory values (minimum greater than maximum, values outside 0–100 % or negative months) are reported on load and reset to the defaults instead of discarding the input — a production point that no longer accepts any animals because of a swapped number would be broken for the player. A <weight> step outside the age range is reported and skipped.

How it is calculated

Amount per animal = Weight(Age) * (0.1 + 0.9 * Health / maxHealthFactor) * (1 + FatteningBonus)
  • Weight(Age) comes from the <weight> steps. In between, it is interpolated linearly (calculateWeight="true") or the value of the last step is held (false). Below the first and above the last step, that step's value applies.
  • Health: a sick animal yields less, but never nothing at all — at 0 % a tenth of the amount remains.
  • FatteningBonus comes from cluster.fatteningBonus, which MaizePlus attaches to the animal group (0 to 0.3). Without MaizePlus the factor is 1.

How many animals can be delivered results from the free storage space divided by the amount per animal, rounded down and limited to the size of the animal group. The free space takes shared storage into account.

What the modder needs to know

  • The target fill type needs its own <capacity> in the <storage> of the same production point, otherwise the input is rejected on load.
  • The trigger in the i3d is a trigger box with trigger="true", collisionFilterGroup="0x20000000" and collisionFilterMask="0x110000" — the same mask as on vanilla's animal loading triggers (trailer and player).
  • An unloading trigger for the animal fill type is not needed. In this case Revamp attaches the storage to the unloading station itself; without that, the production line would never see its ingredient, because the game always queries ingredient stocks through the unloading station and not through the storage.
  • Whether the animal fill type may be bought or sold is controlled, as with any other good, by allowBuying/allowSelling on the <capacity> entry. There is no special rule for it, see Buying and Selling.
  • Several triggers at one point are possible; each one accepts only the breeds registered on it.
  • Several inputs may turn the same breed into different fill types in different age ranges (young animals into X, adult ones into Y). If two ranges overlap, the input entered later applies for the overlapping months.
  • The breed names are the fill type names of the animals from character/animals.xml. Caution with animalType="COW": in FS25 this also includes the water buffalo.

A group that is not accepted does not disappear from the dialog, but shows the reason where the number would otherwise be — wrong animal type, wrong trigger, age or health outside the range, or storage full. Anyone building a production can see immediately while testing which of their limits applies.

Example

<productionPoint>
    <productions>
        <production id="cheese" name="%s %s" params="$l10n_fillType_milk|$l10n_fillType_cheese" cyclesPerHour="60" costsPerActiveHour="1">
            <inputs>
                <input fillType="MILK" amount="10"/>
            </inputs>
            <outputs>
                <output fillType="CHEESE" amount="4"/>
            </outputs>
        </production>
    </productions>

    <storage>
        <capacity fillType="MILK"   capacity="40000"/>
        <capacity fillType="CHEESE" capacity="20000"/>
    </storage>

    <animalTrigger triggerNode="loadingTrigger">
        <inputs>
            <!-- All cattle breeds from 6 to 24 months, the amount is interpolated in between -->
            <input animalType="COW" inputFillType="MILK" minAgeMonth="6" maxAgeMonth="24" minHealthFactor="50" maxHealthFactor="100">
                <weight ageMonth="6"  value="500"/>
                <weight ageMonth="24" value="2000"/>
            </input>
            <!-- Only one breed, no maximum age, fixed steps instead of interpolation, narrower health limits -->
            <input animalSubType="SHEEP_LANDRACE" inputFillType="WOOL" minAgeMonth="12" minHealthFactor="80" maxHealthFactor="100" calculateWeight="false">
                <weight ageMonth="12" value="100"/>
                <weight ageMonth="36" value="400"/>
            </input>
        </inputs>
    </animalTrigger>
</productionPoint>

A cow aged 20 months with 90 % health thus yields 1,667 l × 0.91 = about 1,517 l of milk. A sheep aged 30 months with 90 % health yields 100 l × 0.91 = 91 l of wool, because between steps 12 and 36 the value of step 12 applies.

Porting from FS22

  • The attribute names have stayed the same, the <animalTrigger> blocks of an FS22 Revamp production keep working without changes.
  • The overview of accepted animals is no longer a separate button in the production menu, but a view in the Manage dialog. It only appears at a production point with an animal trigger.
  • Animal types and breeds are named differently in FS25 than in FS22, so the names need to be checked.

Clone this wiki locally