Compatibility
Minecraft: Java Edition
Platforms
Tags
Creators
Details
Remove Fog Plugin
Clearer terrain views while keeping control of your server's real view distance.
RemoveFog is a server plugin rewritten as a hard fork of ClearFog. It adjusts the terrain fog distance advertised to players, with a server default, world settings, and individual player preferences. Players do not need to install a client mod or use resource pack just to remove server side fog.

GIF Animation of comparison using or not using the plugin. Server view-distance is 5, client render distance is 16.
Why use RemoveFog?
Servers often keep their real view distance modest to manage the amount of terrain they send to players. Nearby terrain can then fade into fog, making landscapes, coastlines, and large builds feel more enclosed. RemoveFog lets you move that terrain fog farther away while keeping your chosen chunk-loading and simulation settings.
It is useful when you want:
- A clearer view of terrain already available to the client.
- A consistent fog setting for everyone, with optional exceptions for particular worlds.
- Player-controlled fog preferences without giving players server administration permissions.
- A visual change without increasing the server's actual view distance just to change the fog.
RemoveFog is optional. Use it when this visual change suits your server. It does not create or reveal terrain the server has never sent, extend the client's own rendering limit, or directly remove environmental effects such as lava fog, blindness, or darkness. Client mods and shaders may also change the result.
RemoveFog does not automatically reduce server resource use or guarantee higher FPS/TPS. Its benefit is separating the advertised terrain fog distance from your actual server distance settings. Increasing real server view distance loads/sends more terrain; increasing a RemoveFog value does not instruct the server to do that.
Requirements and compatibility
| Requirement | Details |
|---|---|
| Server software | Spigot, Paper, Leaf, or Folia |
| Minecraft releases | 1.20–1.20.6; 1.21–1.21.11; 26.1, 26.1.1, 26.1.2, 26.2, 26.3 |
| Required dependency | PacketEvents 2.14.0, installed as a separate plugin |
| Java | Use the Java runtime required by your chosen server build. |
| Client installation | None required for the plugin's standard packet-based behavior |
Installation
- Stop your server.
- Put the
PacketEventsSpigot/Paper JAR andRemoveFog-x.x.x.jarin your server'splugins/folder. - Remove the old ClearFog JAR if installed. Avoid running multiple plugins that change the same advertised distance.
- Start the server normally. RemoveFog creates
plugins/RemoveFog/config.ymlandplugins/RemoveFog/messages.yml. - Join and check the result. By default, the global advertised distance is 32 chunks, and world/individual overrides are disabled.
Restart the server after installing or replacing either plugin JAR. /fog reload reloads RemoveFog settings and messages; it is not a plugin installer or hot-reload command.
If migrating from ClearFog, read Migration from ClearFog before the first start.
Quick setup
The default configuration already enables the global adjustment. To change the default and apply future changes to connected players immediately, run these commands as an operator or from console:
/fog directupdates enable
/fog default set 48
Wait for the success reply after each settings command. Changes are saved automatically; no extra save or reload command is needed.
To give one world its own setting:
/fog world enable
/worldfog set 40 world
To let players use their own preferences, an administrator enables the feature:
/fog individual enable
Then grant players removefog.individual.values through your permissions plugin. Each player can use:
/myfog set 48
/myfog get
/myfog unset
unset removes that player's preference so the applicable world/default setting takes over. It does not disable RemoveFog for that player.
How settings are chosen
RemoveFog uses the first matching enabled setting:
- An individual override for the player's UUID.
- A world override, checking the server's world name first and its namespaced world key second.
- The global default.
- The original server-advertised distance if none of the above applies.
For example, with default 32, a world override of 40, and a player override of 48, that player receives 48. Removing their override falls back to 40 in that world. Disabling world overrides then falls back to 32.
Each feature's enabled flag controls whether its stored settings take effect. You can prepare overrides while the feature is disabled; enabling it later activates them. Disabling a feature preserves its stored values. A get command shows the stored value for that scope, not a calculation of the player's final effective distance.
When do changes appear?
| Immediate updates | What happens |
|---|---|
| Disabled — the default | Settings are saved, then used when the server next advertises distance, on a later join, or on a world change. An already connected player may not see a change immediately. |
| Enabled | Changes queue updates for affected tracked players. Enabling the option also reconciles connected players with the current settings. Unchanged distances are skipped. |
Use /fog directupdates enable for convenient live adjustments. Updates are deferred when a tracked connection is temporarily outside the play protocol state. A client may show a visual transition when its advertised distance changes.
To fall back to the server's own distance everywhere, disable all three adjustment scopes:
/fog individual disable
/fog world disable
/fog default disable
With immediate updates enabled, affected connected players are updated. With it disabled, the ordinary update rules above apply. Disabling only the default does not disable higher-priority world or individual overrides.
Commands
<argument> is required; [argument] is optional. Do not type the brackets. Enter commands without the leading / in server console or RCON. Command blocks and other sender types are not supported.
Distances are whole numbers in chunks, from 1 to limits.max-distance (64 by default). This is an advertised distance, not a request to load that many chunks. For set, the distance comes before the target.
Command names and aliases
| Name | Equivalent |
|---|---|
/removefog ... |
Full root command |
/fog ... |
Short root command |
/worldfog ... |
/fog world ... |
/myfog ... |
/fog individual ... |
If another plugin owns /fog, try /removefog.
General administration
| Command | What it does | Permission |
|---|---|---|
/fog |
Show usage help | No additional permission check for help |
/fog reload |
Reload config.yml and messages.yml |
removefog.reload |
/fog diagnostics |
Show connection, refresh, settings, and admission counters | removefog.diagnostics |
/fog directupdates status |
Show whether immediate updates are enabled | removefog.directupdates |
/fog directupdates enable |
Enable immediate updates | removefog.directupdates |
/fog directupdates disable |
Disable immediate updates | removefog.directupdates |
Global default
| Command | What it does | Permission |
|---|---|---|
/fog default status |
Show whether the global default is enabled | removefog.default.status |
/fog default enable |
Enable the global default | removefog.default.status |
/fog default disable |
Disable the global default | removefog.default.status |
/fog default get |
Show its stored advertised distance | removefog.default.values |
/fog default set <distance> |
Save its advertised distance | removefog.default.values |
There is no default unset or default list command.
World overrides
The following commands also work with /worldfog in place of /fog world.
| Command | What it does | Permission |
|---|---|---|
/fog world status |
Show whether world overrides are enabled | removefog.world.status |
/fog world enable |
Enable world overrides globally | removefog.world.status |
/fog world disable |
Disable world overrides globally | removefog.world.status |
/fog world get [world] |
Show the named world's stored override | removefog.world.values |
/fog world set <distance> [world] |
Create or replace a world override | removefog.world.values |
/fog world unset [world] |
Remove a world override | removefog.world.values |
/fog world list [page] |
List stored overrides; page defaults to 1 |
removefog.world.list |
Players may omit [world] to target their current world. Console/RCON must supply it for get, set, and unset. Match the server's world name/key exactly; world targets are case-sensitive. You can configure an unloaded world in advance. Literal periods in names are supported. For names containing spaces, use the YAML configuration instead of a command target.
Example: /worldfog set 48 world_nether. Use the actual world name from your server.
Individual preferences
The following commands also work with /myfog in place of /fog individual.
| Command | What it does | Permission |
|---|---|---|
/fog individual status |
Show whether individual overrides are enabled | removefog.individual.status |
/fog individual enable |
Enable individual overrides for the server | removefog.individual.status |
/fog individual disable |
Disable individual overrides for the server | removefog.individual.status |
/fog individual get [player] |
Show a stored player preference | removefog.individual.values |
/fog individual set <distance> [player] |
Create or replace a player preference | removefog.individual.values |
/fog individual unset [player] |
Remove a player preference | removefog.individual.values |
/fog individual list [page] |
List stored UUID overrides; page defaults to 1 |
removefog.individual.list |
Players may omit [player] to target themselves. To target another UUID, they additionally need removefog.individual.values.others. Console/RCON must supply a target and needs the same applicable permissions.
Targets accept a tracked online player's name or a complete UUID. Offline targets require the full UUID; RemoveFog does not fetch player profiles from the network. Lists show UUIDs, including saved offline preferences.
Examples:
/myfog set 48
/fog individual set 40 Alex
/fog individual get e14ea732-c8df-4d18-a361-6844e42dd917
/fog individual list 2
/myfog enable and /myfog disable control the server-wide individual feature. They are not personal on/off switches. Ordinary players should receive the values permission, without the status permission.
Permissions
All declared permissions default to operators. Non-operator players need explicit grants through your permissions plugin. Permission grants and feature enablement are separate: giving a player the values permission does not turn on individual overrides.
| Permission | Access granted |
|---|---|
removefog.reload |
Reload settings and messages |
removefog.diagnostics |
View diagnostics |
removefog.directupdates |
Read and change immediate updates |
removefog.default.status |
Read, enable, and disable the global default |
removefog.default.values |
Read and change the global default distance |
removefog.world.status |
Read, enable, and disable world overrides globally |
removefog.world.values |
Read, set, and remove overrides for any world |
removefog.world.list |
List world overrides |
removefog.individual.status |
Read, enable, and disable individual overrides globally |
removefog.individual.values |
Read, set, and remove one's own preference |
removefog.individual.values.others |
Also manage other UUIDs; includes removefog.individual.values |
removefog.individual.list |
List all stored individual overrides |
Permission bundles
| Bundle | Included permissions |
|---|---|
removefog.* |
All permissions above |
removefog.default.* |
Default status and values |
removefog.world.* |
World status, values, and list |
removefog.individual.* |
Individual status, values, others, and list |
For a server administrator, grant removefog.*. For ordinary players who should only change their own distance, grant only removefog.individual.values and have an administrator run /fog individual enable once.
The individual wildcard includes control over other players and the global feature toggle. The world values permission applies to every world, even when the player omits the target. There are no separate read-only, per-world, per-rank distance, or personal enable/disable permissions in this release.
Configuration
Settings live in plugins/RemoveFog/config.yml. This is the shipped default:
config-version: 1
direct-view-distance-updates: false
default:
enabled: true
view-distance: 32
individual:
enabled: false
players: {}
world:
enabled: false
worlds: {}
limits:
max-distance: 64
max-overrides: 10000
tracked-players: 1024
pending-commands: 32
pending-per-player: 1
packet-warning-seconds: 60
list-page-size: 10
tab-completions: 80
config-file-bytes: 1048576
shutdown-seconds: 3
For example, replace the corresponding sections with these to enable world and individual overrides:
world:
enabled: true
worlds:
world: 40
world_nether: 48
'world.with.dots': 32
individual:
enabled: true
players:
'e14ea732-c8df-4d18-a361-6844e42dd917': 48
Use your own world names and player UUIDs. Replace existing sections instead of appending duplicate world: or individual: keys. World overrides can also use the actual namespaced world key reported by your server.
After a manual edit, run /fog reload and wait for success. Invalid settings keep the previous working configuration active; correct the file and reload again. Settings created through commands save automatically. Avoid editing the file while submitting settings commands, because a command saves the loaded configuration snapshot.
Resource limits
Most owners can leave these at their defaults.
Key under limits |
Default | Meaning |
|---|---|---|
max-distance |
64 | Maximum accepted advertised distance; configurable from 1 to 256 |
max-overrides |
10000 | Combined stored world and individual override limit |
tracked-players |
1024 | Maximum tracked concurrent connections; additional connections retain their real server distance |
pending-commands |
32 | Shared budget for outstanding settings requests and replies |
pending-per-player |
1 | Outstanding settings request/reply limit per player |
packet-warning-seconds |
60 | Minimum interval between recurring packet-error warnings |
list-page-size |
10 | Override entries displayed per page |
tab-completions |
80 | Maximum suggestions returned |
config-file-bytes |
1048576 | Per-file configuration/message size limit in bytes |
shutdown-seconds |
3 | Maximum configured wait for settings work to drain during shutdown |
Changes to tracked-players, pending-commands, or pending-per-player require a server restart. Reload rejects changes to those capacities. Lowering max-distance below a stored distance rejects the configuration, even if that override's feature is disabled.
Messages
Customize plugins/RemoveFog/messages.yml to change command replies, help, and the prefix. Messages support MiniMessage formatting, such as <green>Saved.</green>. Keep dynamic placeholders such as <target>, <value>, and <reason> in templates that need them. Player-provided values are inserted as plain text.
Reload with /fog reload. Missing message keys fall back to the bundled defaults; invalid message values reject the reload.
Troubleshooting
| Problem | What to check |
|---|---|
| RemoveFog does not enable | Read startup errors. Confirm PacketEvents is installed/enabled, the server version is accepted, and the configuration is valid. |
| A command succeeds but the view stays the same | Enable immediate updates, check whether the relevant scope is enabled, and check for a higher-priority override. Client rendering settings, shaders, and the amount of terrain already sent also affect the view. |
/myfog set works but has no effect |
An administrator must enable individual overrides. Their default state is disabled. |
A player cannot use /myfog set |
Grant removefog.individual.values; permissions default to operators. |
| Unsetting a preference does not restore the original fog | The world/default setting may now apply. Check the precedence rules. |
| An offline player name is rejected | Supply the complete UUID, or use the name while that player is online and tracked. |
| A world command fails for a name with spaces | Configure that world in YAML, then reload. |
| A busy response appears | Wait for the previous success/failure reply and retry. The per-player or shared outstanding-request limit may be reached. |
| Reload rejects a capacity change | Restore the old admission/session limits for a live reload, or stop the server, edit the file, and start normally. |
| Fog returns or behaves inconsistently | Check for another plugin changing view-distance packets and for client-side fog overrides. Avoid running ClearFog alongside RemoveFog. |
/fog opens another plugin's command |
Use /removefog. |
Reading diagnostics
Run /fog diagnostics as an administrator. It reports:
- Tracked: current connection sessions.
- Refreshes / sent: queued refresh attempts and refresh packets sent locally.
- Duplicates / deferred: unchanged refreshes skipped and refresh attempts delayed outside play state.
- Failures: caught packet-handling failures since startup.
- Queued / running: settings worker activity.
- Writes / no-ops: successful file replacements and unchanged edits that avoided a write.
- Pending / rejected: outstanding replies and admission rejections; settings submission rejections are reported separately.
Counters are cumulative and may change while you read them. A deferred/duplicate count alone is not an error, and a local send count does not prove remote receipt. If packet failures increase, retain the accompanying server log and check the PacketEvents/server combination.
When reporting an issue, include your exact Minecraft/server build, Java version, RemoveFog and PacketEvents versions, the command or event that triggered it, diagnostics, and relevant startup/error logs. Include a sanitized configuration when it helps explain override behavior.
Performance and operation
RemoveFog does not run an every-tick fog task or increase chunk tracking. Configuration writes run off the player/server tick path, pending work is bounded, and unchanged edits avoid writes. Immediate updates skip unchanged distances. Large override lists are indexed before command execution.
Actual changed settings still rewrite the configuration file, and override index rebuilding takes worker time. Avoid treating preference commands as a high-frequency animation API. PacketEvents also has its own processing cost, especially on servers that did not already use it.
Choose real view/simulation distances for your workload and monitor your own server. RemoveFog changes terrain fog presentation; player capacity and overall performance depend on your hardware, world activity, and other plugins.
Migration from ClearFog
- Stop the server and back up the ClearFog data folder.
- Remove the ClearFog JAR, leaving
plugins/ClearFog/config.ymlin place if you want to import it. - Install PacketEvents and RemoveFog, then start normally.
- If
plugins/RemoveFog/config.ymldoes not already exist, RemoveFog copies the sibling ClearFog config into its own folder. The original file is preserved. - Review startup validation. Older distances above
64require a suitablelimits.max-distancevalue, up to256, or smaller configured distances before retrying startup. - Replace old permission grants with the appropriate
removefog.*permissions and customize the new message file.
An existing RemoveFog config is not overwritten by automatic import. ClearFog's old message layout is not imported. Old update-check settings may remain in an imported file as unused data.


