NeoTF server administration commands, by authorization level
An admin command that fails these does nothing at all — no error, no message. It looks exactly like a broken or misspelled command.
1. You must be authorized. Your SteamID / WONID / IP and an
AuthLevel must be listed in ntf_users.ini.
2. ntf_feature_admin must be on — without
it every neotf_* command is a silent no-op.
3. Wait about 10 seconds after enabling it. NeoTF rebuilds
its feature flags on a timer, so setting the cvar and running a command in
the same breath will not work.
The Half-Life console treats : as a token of its own, so an unquoted Steam ID arrives split into pieces and the command prints its usage line instead of running:
ntf_msg STEAM_0:1:12345 "text" <-- WRONG, argv1 is just "STEAM_0" ntf_msg "STEAM_0:1:12345" "text" <-- correct
This is engine behaviour, not a NeoTF bug, and it affects every command
taking an ID — ntf_msg, ntfsv_exec,
ntf_deletemsg, neotf_ban,
neotf_checkdev_steam. Nothing quotes it for you.
Several commands skip bots deliberately, and most of the
_all variants skip them too.
<USER ID> Slot number assigned to each player ("status" or "users")
<STEAM ID> STEAM_0:0:123456789 format -- ALWAYS QUOTE IT
<NAME> Player's name (quote it; substrings work if unambiguous)
<person> Any of the three above: name, Steam ID or user ID
<color rgb> Red, Green, Blue values (0-255)
<origin xyz> Coordinates in 3D space (x y z)
<team> Team number (1-4)
<classnumber> Class numbers (1-9, 11 = civilian)
<duration> Time, usually in seconds
<cvar> Server cvar name (e.g. ntf_jetpack_armor)
<value> Numeric value (e.g. 100, 1.0, 0.5)
<command> Console / server command
[abcdefg] Arguments in square brackets are optional
Click a heading to expand it. The number beside each is the AuthLevel bit required; an AuthLevel is the sum of the levels you want to grant.
neotf_antifreeze (duration) neotf_concussioneffect_all (integer) neotf_fov <player> (integer) neotf_fov_all (integer) neotf_punchangle <person> (x y z) SETS the punchangle neotf_punchangle_all (x y z) neotf_slap <person> neotf_slap_all neotf_velocity <person> (x y z) ADDS to current velocity neotf_velocity_all (x y z) neotf_weaponstrip <player> neotf_llama <player> neotf_llama <player> off neotf_gag <player> neotf_gag <player> off neotf_anydeath <person> (type) 0 = plain, above 6 = RANDOM neotf_anydeath_all neotf_slay <person> (life width amplitude) unclamped -- see below neotf_slay2 <person> same, but clamped neotf_screenfade <person> (r g b) (alpha) neotf_screenfade_all (r g b) (alpha) ntfsv_command screenfade_all (r g b) (alpha) neotf_plague <player> neotf_plague_all ntfsv_command plague_all ntfsv_command cure_all neotf_civ <person> neotf_civteam (team) neotf_civall neotf_civ <person> <lock?> neotf_civteam (team) <lock?> neotf_civall <lock?> neotf_civ <person> <unlock> neotf_civteam (team) <unlock> neotf_civall <unlock> neotf_classlock <player> <class> neotf_classlock <player> 0 neotf_admincam <person> neotf_admincamoff togglecam cammenu
neotf_velocity takes (x y z), not
(r g b). The original documentation had this wrong for
twenty-two years — the _all variant beside it was always
documented correctly. It ADDS to the player's current velocity;
neotf_punchangle, immediately above it, assigns instead.
neotf_slay takes
(life width amplitude) for the lightning bolt it draws, not
(r g b). The three values are passed to the engine with
no clamping at all, which is exactly why
neotf_slay2 exists — it clamps all three. Prefer slay2
unless you know what you are sending.
neotf_anydeath's type argument
is not clamped upward: below 1 becomes 0, but anything above 6
picks a RANDOM death rather than the highest one. So
neotf_anydeath bob 99 is the way to ask for a random one.
The velocity, punchangle and slay commands do not check how many arguments you gave them. A missing number reads as 0 rather than producing an error.
neotf_map <mapname> neotf_pass <password> neotf_nopass ntf_reload neotf_cvar <cvar> neotf_cvar <cvar> (value)
neotf_exec <person> (command) neotf_execall (command) neotf_execteam (team) (command)
neotf_kick <ID> neotf_ban (duration) "<ID>" neotf_unban "<ID>"
Note the quotes around the ID in the ban commands — they are required, for the reason given at the top of this page.
neotf_to <person> neotf_teleport <person> (x y z) neotf_speakall "(text)" neotf_fakedeath <killer> <victim> (weapon) neotf_team <player> (team) neotf_class <person> (classnumber) discoball discoball2 neotf_kill_discoball neotf_kill_discoball2 neotf_makelight (r g b) (area) neotf_kill_makelight neotf_glow_all (r g b) neotf_glow <person> (r g b) all zero = OFF neotf_lightstyle (string) neotf_supertrail <radius> <glow> <white> <follow>
neotf_glow has no on/off argument.
neotf_glow bob 0 0 0 is how you turn a glow off — the
all-zero colour is the switch. Each component is clamped to 0-255.
neotf_opendoor neotf_use_ent ntf_cycler <origin xyz> <type> ntf_item_quad <team> <duration> <delay> <onfloor?> ntf_item_invul ... ntf_item_invis ... ntf_item_airtank ... ntf_speedball ... ntf_item_antidote ... ntf_item_weapon ... ntf_item_weaponbox ... ntf_tentacle ... ntf_tentacle_maw ... ntf_barnacle ntf_xen_tree ntf_tank ntf_tanklaser neotf_ent_button <team> <make name?> neotf_ammopack2 ... neotf_ammopack ... neotf_triggerhurt ... neotf_trigger_teleport ...
Being authorized is not enough — each of these also needs its own feature cvar, and some are grouped in ways the name does not suggest:
ntf_feature_tentacle tentacle AND tentacle_maw (needs a map change) ntf_feature_barnacle barnacle (needs a map change) ntf_feature_mappowerup the 5 powerups and speedball ntf_feature_mapweapon ntf_tank and ntf_tanklaser ntf_feature_xentree xen_tree (needs a map change)
ntf_feature_mapweapon is what gates the tanks, which is
not obvious. The ones marked "needs a map change" are only read at map load
— set the cvar, then changelevel.
These commands check placement strictly and report failure in a way rcon cannot see. A tentacle needs 400 units of headroom; a barnacle needs a real ceiling. Most build spots inside a base are also blocked by nobuild or respawn zones.
ntf_elvis togglegod apachenuke neotf_give_invul ... neotf_giveall_invul ... neotf_give_quad ... neotf_give_ammo ... neotf_give_detpack ... neotf_give_cure ... neotf_give_weapon ... addhealth addarmor addarmor (integer) toggleclip ntf_msg "<id>" "message" ntf_getmsg ntf_dumpmsg ntf_deletemsg <msg#> ntf_replymsg "message" neotf_psay <person> "(text)" neotf_tsay "(text)" (r g b) neotf_csay "(text)" (r g b) llamacage [2-4] detspecialcage llamaport <player> <cage#> llamafy [2-4] unllamacage <player> neotf_timeleft neotf_serverdate neotf_checkdev_steam "<ID>" neotf_mp3_all <playtype> <tracknumber> ntf_status
On 1.9.0, caging three players and then having the first one disconnect takes the whole server down on the next tick. If you are running 1.9.0, avoid using all three cage slots. Fixed in 1.9.1 — see the changelog.
ntfsv_teamlist (type) ntfsv_csay (text) (rgb) ntfsv_command ... ntfsv_create ... ntfsv_removeent ...
These run from the server console or rcon rather than from a player, so they do not use the AuthLevel system.
Many NeoTF commands report through the server log rather than the console, so over rcon they look like they did nothing. Turn the log echo on and the replies come straight back:
mp_logecho 1 log on
Every admin command is logged when it runs, so this is also the quickest way to confirm that your authorization is actually working.