promotional bannermobile promotional banner

Armor Stand Optimization For servers

Thousands of armor stands. No lag. Nothing else changes.
video thumbnail

Description

ArmorStandOptimizer

Armor stands are quietly eating your TPS.

Every armor stand on your server re-runs the same physics twenty times a second whether it is doing anything or not: fluid checks, block scans, gravity, collision. A decorated spawn. A shop district. A cosmetics hub. Thousands of them, all recalculating that they are still standing exactly where they were.

This plugin lets the idle ones rest, and wakes them the instant anything happens.


The numbers

Measured on a real Paper 1.21.11 server, 5000 armor stands piled in one spot:

  Tick time
Without the plugin 13.1 ms
With the plugin 3.7 ms

That is 72% less tick time. Switch the plugin back off mid-session and the cost comes straight back on the same stands in the same world, which is how you know it is the plugin and not luck.

Cost scales linearly, so this holds whether you have five hundred stands or eight thousand.


Nothing about them changes

This is the part that actually matters, so it was tested rather than assumed. A sleeping armor stand:

  • still falls the moment you break the block underneath it
  • still gets punched, broken, and equipped exactly as before
  • still burns, takes damage and dies on the same schedule
  • keeps its hitbox, pose, armor, name and tags
  • still fires every event your other plugins are listening for

Fire is the strictest test, because it is the one kind of damage that needs the stand to keep ticking. Igniting one with the plugin off, then again with it on and fully asleep, gives the identical health curve:

 
 
 
 
plugin off: 20 -> 12 -> 8 -> 4 -> burned away
plugin on: 20 -> 12 -> 8 -> 4 -> burned away
 
 

Anything that can affect a stand - damage, a punch, a piston, flowing water, an explosion, a block breaking underneath, a teleport, another plugin pushing it - wakes it before it matters.


Frames as well as TPS

A vanilla client redraws every armor stand's dozen cuboids every single frame. No server can make that cheaper; the only thing a server controls is how many entities it sends.

So on a normal server this does nothing at all. Only once a player has hundreds of stands around them does it start sending the nearest ones and holding back the rest, and anything held back stays clickable: whatever you aim at is sent back to you instantly, and a swing that lands before it arrives is applied anyway.

Stands that are invisible and have no hitbox are simply never sent. They draw nothing and cannot be clicked, so you cannot tell the difference.

Prefer to keep every pixel? /aso profile safe gives you the TPS win and never withholds anything.


Setup

Drop the jar in plugins/ and restart. There is nothing you have to configure.

Every option in config.yml is documented inline if you want to tune it, and four presets are a command away:

Profile What it does
balanced the default, and the right answer for almost everyone
safe server-side only, nothing is ever withheld from a client
max squeezes hardest when you have enormous piles of stands
off plugin does nothing

Commands

All under armorstandopt.admin (default: op). Aliases /aso and /asopt.

Command What it does
/aso status how many stands, how many are resting, why the rest are not, and what the plugin itself costs per tick
/aso profile <name> switch preset without a restart
/aso spawn <n> [radius] spawn test stands so you can measure it yourself
/aso clear remove those test stands
/aso advise check the Paper settings that overlap with this plugin
/aso reload re-read config.yml
/aso restore [all] hand every stand back exactly as it was

Want to see it for yourself? /aso spawn 5000 2, watch your TPS, then flip between /aso profile off and /aso profile balanced.


Requirements

  • Paper, or a Paper fork such as Purpur or Pufferfish
  • Minecraft 1.21.11 through 26.2 - one jar covers the whole range
  • Spigot and CraftBukkit will not work. This relies on Paper-only API
  • Folia is not supported. The plugin detects it and disables itself rather than risk your server

Note that 26.x servers need Java 25 to run at all. That is a Minecraft requirement, not a plugin one.


Good to know

Straight answers to the things you would otherwise find out the hard way:

  • The visual trade is real. Once a player has hundreds of stands around them, the distant ones in a huge pile are not drawn. That is the only lever any server has over client frame rate. safe mode turns it off.
  • The frame-rate side has not been benchmarked. The TPS numbers above are measured; frame rate needs a real game client and a GPU to measure, so treat that half as yours to confirm.
  • Holograms are safe. Stands with a visible name, glowing stands, and stands used as seats or mounts are never withheld from anyone.
  • It plays nicely. Stands another plugin has already frozen are left alone, and any stand tagged asopt_ignore is skipped entirely.
  • It cleans up after itself. Ticking is handed back before a chunk unloads, before an entity is removed, and when the plugin is disabled, so nothing is ever written to disk in a frozen state.

Armor Stand Optimization For servers Team

profile avatar
Owner
  • 1
    Projects
  • 145
    Downloads

I make java/bedrock mods and plugins

Donate