|

The Things You Cannot Configure

This entry is part 6 of 7 in the serie Under Rust

Under Rust

The Controls Under Rust (1)

Weather Is Not the Environment (2)

The Living Island (3)

The Island Is Allowed to Rot (4)

Systems With Their Own Control Panels (5)

The Things You Cannot Configure (6)

Commands and Convars Console Reference (7)

Where the Console Stops

After five articles, Rust’s console can begin to look almost omniscient.

Weather has controls.

Time has controls.

Populations have controls.

AI can expose perception, reasoning, navigation and processing budgets.

Decay can be divided into upkeep, delays, durations and brackets.

Entire features can acquire namespaces containing dozens of variables.

It becomes tempting to assume:

If Rust does something, there must be a ConVar for it somewhere.

There is not.

The F1 console is a control surface. Facepunch itself describes it as a way to manipulate the game within certain parameters; it is not presented as a complete representation of every internal rule running the game. (Facepunch Wiki)

And this distinction is where the series ends.

Because sometimes the most interesting thing about a system is precisely what the console does not expose.


An Exposed Variable Is Only an Exposed Variable

Consider:

ai.npc_only_hurt_active_target_in_safezone = TRUE

Its current public description is very specific: while in a safe zone, an NPC is restricted to hurting its actively targeted player rather than other players. (Corrosion Hour)

That tells us something useful.

It exposes a:

safe-zone context → active target → damage permission

rule.

But it does not explain:

how the NPC selected that target

how safe-zone protection itself works

how every type of NPC behaves there

or:

how animals decide whether a player is relevant at all

The ConVar exposes one gate inside a larger system.

Nothing more.


Safe Zones Are a Good Example

Facepunch has separately changed animal behaviour in safe zones.

An official changelist explicitly notes:

Animals no longer attack players in safe zones.

The same period also included changes to player damage protection inside safe zones. (Rust)

That released behaviour exists.

But the current console does not give us a convenient variable called:

animals.ignore_players_in_safezones

that explains the complete mechanism.

Meanwhile:

ai.npc_only_hurt_active_target_in_safezone

clearly exists, but describes something narrower. (Corrosion Hour)

So we have:

documented behaviour

and:

an exposed safe-zone AI control

without enough evidence to claim that the exposed control is the mechanism producing every part of that behaviour.

That difference matters.


Similar Effects Can Come From Different Systems

Suppose an animal does not attack a player.

There are many possible explanations.

The animal might not perceive the player.

The player might not be considered a valid target.

A relationship rule might prevent aggression.

A safe-zone rule might intervene.

The AI might be dormant.

Movement might be disabled.

Navigation might fail.

Another behaviour might currently have higher priority.

Or a system not exposed to administrators might have made the decision.

The visible result is always the same:

animal does not attack

The internal cause is not.

That is why observable behaviour should not automatically be translated into a mechanism.


Sometimes the Console Shows Only the Edges

One of the strangest current namespaces is:

wildlifehazard.*

The public admin inventory contains exactly these controls:

ConVar Default Public description
wildlifehazard.chancetorepositionmultiplier 1
wildlifehazard.clienttickrate 0.1
wildlifehazard.reactiontimemultiplier 1
wildlifehazard.repositionattempts 5
wildlifehazard.repositionradiusmultiplier 1
wildlifehazard.repositiontimermultiplier 1

Corrosion Hour currently lists all six, their defaults, and no descriptions for any of them. (Corrosion Hour)

This is useful precisely because it is incomplete.

The names tell us that some system deals with:

reaction timing

repositioning

number of attempts

radius

and:

client update timing

But they do not tell us what a Wildlife Hazard actually is in enough detail to reconstruct the system.

The console has exposed the edges of a machine without giving us its diagram.


A Name Is Evidence, Not an Explanation

wildlifehazard.repositionattempts = 5

proves that something called a wildlife hazard can attempt to reposition and that the default attempt count is five. (Corrosion Hour)

It does not prove:

what triggers repositioning

what counts as a valid new position

what entity is being repositioned

what happens after all five attempts fail

or:

why repositioning was required in the first place

We can reasonably form questions from the name.

We cannot turn those questions into answers.

This is the point where a command registry and actual system documentation become two different things.


Even Detailed AI Controls Leave Gaps

The ai.* namespace contains some remarkably descriptive variables.

For example:

ai.npc_gun_noise_silencer_modifier = 0.15

publicly describes how a silencer modifies gun noise for NPC AI. (Corrosion Hour)

ai.npc_families_no_hurt = TRUE

explicitly prevents NPCs in the same family from hurting each other. (Corrosion Hour)

ai.npc_speed_sprint = 1

is documented as a speed value between 0 and 1. (Corrosion Hour)

Those controls are unusually generous.

But even hundreds of variables like them would still not amount to the entire AI implementation.

For example:

ai.npc_families_no_hurt

tells us that NPC families exist as a relationship concept.

It does not give us a public table defining every family, every relationship and every exception.

Again:

the variable reveals a concept.

It does not necessarily reveal the complete system behind that concept.


Sometimes a Variable Reveals a Hidden Behaviour

The reverse can also happen.

A behaviour may exist in Rust but remain nearly invisible under default settings.

ai.animal_ignore_food = TRUE

is a good example.

Its public description says that when enabled, animals do not sense food sources or interact with them, and explicitly identifies the default as a server optimization. (Corrosion Hour)

That means the name tells us about behaviour that normal vanilla configuration mostly hides:

animals can sense and interact with food.

The ConVar does not create that capability.

It suppresses it.

This is a very different relationship between configuration and gameplay.

Sometimes the console enables a feature.

Sometimes it adjusts one.

Sometimes it exposes a feature that already exists by letting us stop suppressing it.


No ConVar Does Not Mean No System

This is the mirror-image mistake.

Suppose we search the console for a specific observed behaviour and find nothing.

That does not establish:

Rust has no system for this.

It tells us only:

We have not found a public console control for it.

Many game behaviours have no reason to be administrator-configurable.

They may be:

hard-coded conditions;

component settings;

prefab properties;

animation events;

map volumes;

entity flags;

internal state machines;

scripted triggers;

or values supplied by another system.

The F1 console manipulates only the parameters Facepunch chooses to expose there. (Facepunch Wiki)


A Biome Is a Good Reminder

In Weather Is Not the Environment, we saw that Rust exposes several biome-specific fog controls.

That gives us real evidence that the atmospheric system can differentiate biome context.

But there is still no single:

biome.environment

variable containing everything that happens when a player crosses from Arid into Arctic.

Nor should we expect one.

Weather may read biome information.

Spawning may read biome information.

Vegetation placement may use it.

Temperature can respond to location.

Other systems may have their own local conditions.

The fact that several changes happen at approximately the same boundary does not mean one master function owns all of them.

The console helps separate those layers.

Its silence between them is equally informative.


One Trigger Can Create a Very Convincing Behaviour

Games are particularly good at making simple triggers look intelligent.

Something reacts at exactly the right moment and the player naturally assigns intention to it.

But technically:

event occurs → scripted response

can look almost identical to:

entity perceives event → evaluates it → chooses response

Those are very different mechanisms.

This matters especially when studying ambient life.

An environmental animal, decorative bird or other ambient element may react convincingly without necessarily participating in the same sensory and reasoning systems used by fully simulated NPCs.

Unless Rust exposes the mechanism or Facepunch documents it, the safest statement remains:

this event produces this visible response.

Not:

this entity understood why the event happened.


Configuration Is Also Not Source Code

Some ConVars have extraordinarily specific names:

ai.npc_cover_path_vs_straight_dist_max_diff

ai.npc_deliberate_miss_to_hit_alignment_time

aimanager.ai_dormant_max_wakeup_per_tick

Names like these can feel almost like reading the code itself.

They are not.

They are public inputs into code.

The implementation still decides:

how the value is consumed;

when it is evaluated;

what other conditions override it;

which entities use it;

and what happens when several systems disagree.

A configuration variable is a handle attached to the machine.

It is not the machine.


F1 Became More Helpful — and More Complicated

This became especially important in April 2026.

Facepunch’s Spring Clean update improved console autocomplete so administrators could see server commands directly in F1.

At the same time, Facepunch added AI-generated descriptions for missing console command descriptions. (Rust)

That made the current console substantially easier to explore.

But it introduced a new documentation distinction.

A description displayed in F1 may be:

an original developer-written description

or:

a description generated later to fill an empty field.

Both can be useful.

They do not carry exactly the same documentary weight.


Generated Description Is Not Developer Commentary

This does not mean generated F1 descriptions should be ignored.

They can be excellent navigation aids.

They can explain an obscure name.

They can help an administrator discover what to test.

But if we are trying to understand why a system behaves a certain way, an automatically generated description should not quietly become evidence that a developer explicitly documented the mechanism.

Facepunch itself identified these as generated descriptions when the feature was introduced. (Rust)

So a useful evidence hierarchy remains:

developer documentation

released change notes

current exposed control

specialist documentation

reproducible observation

inference

Different questions require different levels.


Blank Documentation Is Also Information

The six wildlifehazard.* variables illustrate this beautifully.

They exist.

They have defaults.

They have names.

But the current public command inventory leaves their description fields blank. (Corrosion Hour)

We could treat that as a failure and fill the gaps ourselves.

Or we can record something much more useful:

Current public documentation does not explain this namespace sufficiently.

That statement has value.

It tells the next researcher where not to assume too much.

It tells an administrator that experimentation may be necessary.

And it gives us a precise target if a future Facepunch commit, devblog or documentation update explains the system.


Documentation Has a Date Too

Commands evolve.

Descriptions evolve.

Defaults evolve.

Sometimes a ConVar remains while the system around it changes considerably.

Sometimes a newer command replaces an older one.

Sometimes documentation simply never catches up.

This is why an old page can still be extremely valuable for explaining why a current control exists while being unreliable as an inventory of today’s controls.

Likewise, a current command list can accurately prove that a ConVar exists today while telling us almost nothing about its history.

There is no contradiction.

They answer different questions.


The Console Can Reveal Questions Better Than Answers

This may be its greatest value for Rust Observer.

Take:

ai.npc_families_no_hurt

Instead of merely asking:

How do I turn this off?

we can ask:

What does Rust consider an NPC family?

Take:

wildlifehazard.repositionattempts

and the question becomes:

What is a Wildlife Hazard, and why does it need repositioning?

Take:

aithinkmanager.petframebudgetms

and we can ask:

Why do pets have a separately budgeted AI workload?

Take:

weather.biome_fog_*

and the question becomes:

Which atmospheric properties are actually local to biome context?

The console does not always answer those questions.

Sometimes its greatest contribution is proving that the question is worth asking.


Current Sparse Controls

A useful final table for the series is therefore not a list of well-documented commands.

It is almost the opposite.

Controls That Expose More Questions Than Answers

ConVar Default What We Actually Know
wildlifehazard.chancetorepositionmultiplier 1 A reposition chance multiplier exists
wildlifehazard.clienttickrate 0.1 Wildlife Hazard has a client tick rate
wildlifehazard.reactiontimemultiplier 1 Reaction timing can be multiplied
wildlifehazard.repositionattempts 5 Repositioning has a finite attempt count
wildlifehazard.repositionradiusmultiplier 1 Reposition radius can be scaled
wildlifehazard.repositiontimermultiplier 1 Reposition timing can be scaled

The defaults are publicly listed, but current public descriptions are blank. (Corrosion Hour)

That is all we need to say.

Anything beyond it requires stronger evidence.


What We Learned From What Rust Exposes

Across Under Rust, the console showed us:

weather presets

atmospheric parameters

biome-dependent fog

environment time

managed populations

spawn maintenance

AI dormancy

sensory updates

reasoning

navigation

processing budgets

building upkeep

decay timing

feature-specific economies

temporary world lifecycles

and many smaller control surfaces.

Each one revealed a seam in the game.

But seams are not the whole structure.


What We Learned From What Rust Does Not Expose

The missing controls teach something different.

They remind us that:

visible behaviour is not automatically its cause

one exposed gate is not the entire system

one namespace does not contain every system affecting a feature

an undocumented value should remain undocumented

a missing ConVar does not imply a missing mechanism

and:

configuration is not source code

These limits do not make the console less useful.

They make it possible to use the console correctly.


Under Rust

Rust presents itself as an island.

Players see forests, bases, animals, Scientists, storms, monuments, vehicles and other players.

Administrators see another version of the same place:

weather.*

env.*

spawn.*

ai.*

aimanager.*

decay.*

deepsea.*

and hundreds of other names.

Neither view is complete.

One shows us the result.

The other exposes some of the controls that helped produce it.

The interesting work begins when the two disagree.

A bear stands perfectly still.

A sky changes colour at a biome boundary.

A player enters a safe zone and an animal suddenly stops behaving normally.

A building survives longer than expected after its Tool Cupboard disappears.

A feature seems simple until its own namespace contains forty controls.

Those moments reveal the seams.

And once we can see the seams, we can start asking a better question than:

What command changes this?

We can ask:

What part of Rust am I actually looking at?

Sometimes the console answers.

Sometimes Facepunch documented it years ago.

Sometimes testing exposes another layer.

And sometimes Rust gives us nothing more than a strangely named variable with a default value.

That is not the end of the investigation.

That is usually where it starts.

Views: 34

Similar Posts