Tags
Creators
Details
1.0.0
Compatibility
Changes
FrozenVillagers 1.0.0
Cuts villager lag without changing how villagers play. FrozenVillagers finds the villagers whose AI isn't doing anything useful, slows them down, and keeps trading, restocks and level ups working the vanilla way. First release, published as a beta.
Highlights
- Automatic, no name tags or blocks. Villagers locked in a 1x1 trading cell and the jobless surplus piled up next to a breeder are slowed down on their own: their AI runs 1 second every 10.
- Gameplay stays vanilla. Trading, prices and reputation are unchanged, level ups happen the vanilla way with the new trades, and restocks happen at fixed times of day (07:00, 12:00 and 17:00 by default) when a player opens the trades.
- Leaves the right villagers alone. Iron farms, villages, babies, villagers that never traded (so rerolling works), NPCs and villagers changed by other plugins are never touched automatically.
- Staff control.
/fv freeze,/fv unfreezeand/fv autofor any villager, by radius or selector, and/fv inspectto see what the plugin does with a villager and why. - Safe. It never makes villagers invincible and never removes them. Slowed down villagers get their AI back right away when they are hurt, near a raid, or when a bed or workstation is placed nearby, and when the plugin is removed.
- Easy to switch to.
/fv adopttakes over villagers optimized by BubbleVillagers, VillagerOptimizer or AntiVillagerLag, or letmigration.adopt-other-optimizersdo it as chunks load.
Results
Average tick time (MSPT) on Paper 26.2. Above 50 ms a server lags.
| Without the plugin | FrozenVillagers | |
|---|---|---|
| 1,146 villagers like a busy survival server, default config | 50.7 ms | 18.6 ms (-63%) |
| Same, trading halls frozen by staff | 50.7 ms | 13.4 ms (-74%) |
| 4,000 villagers with a player online, automatic | 208 ms, 4.8 TPS | 88 ms, 11.3 TPS |
| 4,000 villagers, everything frozen by staff | 208 ms, 4.8 TPS | 7.2 ms, 20 TPS |
The plugin itself costs about 0.1 to 0.25 ms per tick, shown live in /fv status. How it was measured is in the README.
Installation
- Put
FrozenVillagers-1.0.0.jarinpluginsand restart the server. - That's it: trapped and surplus villagers are handled automatically.
- Optionally freeze your biggest trading halls with
/fv freeze <radius>, and check everything with/fv statusand/fv inspect.
Commands
All commands need frozenvillagers.admin (op by default). /fv is short for /frozenvillagers.
| Command | What it does |
|---|---|
/fv freeze [radius|selector] |
Freezes villagers |
/fv unfreeze [radius|selector] |
Gives them their AI back and excludes them from the automatic features |
/fv auto [radius|selector] |
Puts them back to automatic |
/fv adopt [radius|selector] |
Takes over villagers another optimizer plugin froze |
/fv inspect [selector] |
Shows what the plugin does with a villager and why |
/fv status |
Counts the villagers and shows the plugin's own cost |
/fv reload |
Reloads the config |
Without an argument a command works on the villager you are looking at. A number is a radius around you. A selector also works from the console.
Configuration
The defaults work out of the box. The options you are most likely to change:
| Option | Default | What it does |
|---|---|---|
restock.times |
[1000, 6000, 11000] |
Restock windows in day time: 07:00, 12:00 and 17:00 |
restock.mode |
reset-uses |
reset-uses keeps prices as they are, vanilla lets demand raise them |
restock.require-workstation |
false |
Only restock villagers whose workstation is still next to them |
surplus.crowd |
12 |
How many jobless villagers without a bed make a crowd |
births.enabled |
false |
Stop breeding when there is too much surplus around the breeder |
freeze.disable-physics |
false |
Also turn off physics for villagers frozen by staff |
migration.adopt-other-optimizers |
false |
Adopt villagers from BubbleVillagers and similar plugins as they load |
worlds |
[] |
Worlds for the automatic features, empty means all |
The full config.yml
# FrozenVillagers. Every option is explained in the README.
# Worlds where the automatic optimizations run. An empty list means all
# worlds. Villagers frozen by staff with /fv freeze stay frozen everywhere.
worlds: []
# How often, in ticks, each villager is checked again. The checks are spread
# over these ticks, so they never all happen at once. 100 = 5 seconds.
check-interval: 100
# For switching from BubbleVillagers, VillagerOptimizer or AntiVillagerLag.
# With true, every villager those plugins optimized is adopted on its own
# when its chunk loads, like /fv adopt does. Villagers whose AI any other
# plugin turned off are still left alone. Turn it off again once
# /fv status shows no villagers without AI because of another plugin.
migration:
adopt-other-optimizers: false
# /fv freeze, for staff.
freeze:
# Frozen villagers always have their AI, item pickup and pushing turned
# off. With true their physics are off too: they no longer fall or get
# pushed by water. Saves a bit more, but only use it for villagers that
# stand on solid ground.
disable-physics: false
# The largest radius allowed in /fv freeze, unfreeze, auto and adopt.
max-command-radius: 32
# Villagers the plugin slows down get their AI back for "active" ticks
# every "cycle" ticks, and have it off the rest of the time. The default is
# 1 second every 10 seconds.
pulse:
cycle: 200
active: 20
# Villagers that can't move and have nothing to look for, except a bed they
# can never reach: locked in a 1x1 cell or in a vehicle, with a profession,
# traded at least once, without a bed. They are slowed down. Since they
# can't move anyway, players don't see any difference.
trapped:
enabled: true
# Surplus villagers: adults with no profession (or nitwits) that have had no
# bed for a while, packed together with many others like them. This is what
# piles up next to a breeder. They are slowed down until they find a bed or
# a job, or the crowd shrinks. Iron farm villagers always have a bed, so they
# are never touched.
surplus:
enabled: true
# How many villagers without a bed and a job there must be in the 3x3
# chunks around a villager for it to count as surplus.
crowd: 12
# Ticks without a bed before a villager can count as surplus. 6000 = 5 minutes.
grace: 6000
# Turn off pushing between surplus villagers. Saves work in big crowds, but
# entity cramming no longer kills them, so a crowd can grow without limit.
disable-collisions: false
# Stops breeding when there is too much surplus around the parents, even if
# it is stored in other chunks. No villager is ever removed.
births:
enabled: false
# Villagers without a bed and a job (babies included) allowed within
# "radius" blocks of the parents before babies stop being born.
max-surplus: 24
radius: 64
# Villagers frozen or slowed down by the plugin can't walk to their
# workstation, so they restock when a player opens their trades, once per
# window below. Day times: 0 = 06:00, 1000 = 07:00, 6000 = 12:00, 11000 = 17:00.
restock:
enabled: true
times: [1000, 6000, 11000]
# reset-uses: trades are refilled and prices don't go up with demand.
# vanilla: the vanilla restock, prices go up a bit for trades used a lot.
mode: reset-uses
# Only restock villagers whose workstation is still there and close to them.
require-workstation: false
# Max distance in blocks from the villager's feet to its workstation.
workstation-reach: 2.5
# Sent to the player when a villager restocks. Empty sends nothing.
# MiniMessage format, %next% is the time until the next restock.
message: ""
Run /fv reload after changing it. Bad values are reported in the console and replaced by the defaults.
Switching from BubbleVillagers or VillagerOptimizer
- Back up your world.
- Install FrozenVillagers, set
migration.adopt-other-optimizers: true, remove the old plugin and restart. - Run
/fv adopt @e[type=villager]from the console for the villagers already loaded. The others are adopted when their chunk loads. - When
/fv statusshows no villagers without AI because of another plugin, set the option back tofalseand run/fv reload.
Villagers optimized by BubbleVillagers were invincible and ignored by zombies. With FrozenVillagers they behave like vanilla villagers again, so let your players know.
Requirements
- Paper 26.2
- Java 25
Folia, Purpur and Spigot are not tested yet.
Links
- README: every option, how each feature works, the benchmark and the tests
- Issues: bug reports and ideas
SHA-256 of FrozenVillagers-1.0.0.jar: 6e6122d68d15b072f953f9e4fe28c9933b6317c56ebb267d4b785776e30c6fcd
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:Lm3tmH5h:osG3rXud"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:Lm3tmH5h:osG3rXud"
}

