Reference

Every node, explained

What each of the 288 nodes does, when to reach for it, a worked example, and the traps worth knowing before they cost you an evening.

Events

Events/Creatures

On Creature Killed

eventserverevent.creatureKilled

Fires when an infected or animal is killed. Killer is the player who killed it, or empty for deaths not caused by a player. Type is the creature's classname (e.g. for a bounty per zombie).

Outputs
(exec)exec
Creatureentity
Killerplayer
Typestring

Fires on the server whenever an infected or an animal dies. It rides EEKilled on the two gameplay base classes every creature in DayZ inherits from — ZombieBase for all infected, AnimalBase for all animals — because the shared engine class underneath them cannot be modded at all. A creature is only ever one or the other, so the event fires exactly once per kill.

Killer resolution works the same way as it does for players: the engine hands over the source of the death, which for a shooting is the weapon rather than the shooter, and the node walks up to the player holding it. Anything that is not a player — a bear mauling a wolf, a car, a landmine, fall damage — leaves Killer empty.

When to use it

Bounties, hunting rewards, horde-clearing objectives, loot drops on death, kill counters for a leaderboard. This node never fires for players; use On Player Died for those.

Pins

Creature — the dead body as an entity, not a player. Feed it to Get Entity Position to spawn something where it fell, or to Delete Entity to clean it up.

Killer — the player responsible, or empty. Test with Is Valid before paying out, or environmental deaths quietly reward nobody.

Type — the creature's classname, for example ZmbM_CitizenASkinny or Animal_UrsusArctos. This is how you tell a chicken from a bear.

Example

A bounty that pays more for the dangerous ones: On Creature KilledIs Valid (Killer) → Branch. The True arm runs Switch On Text on the Type with Match 1 set to Animal_UrsusArctos. Case 1 adds 50 to the Killer's saved bounty with Add To Saved Player Number and the Default path adds 5, and each of those two paths ends in its own Send Notification built from Get Saved Player Number (bounty) → Join Text ("Bounty: " + total). Keep the two paths separate rather than wiring them back into one shared notification — converging exec wires make the compiler copy everything downstream under both.

To drop loot where it fell, wire the Creature into Get Entity Position and that into Spawn Item (Ammo_762x39) on the same arm.

Watch out

  • Classnames are exact and case-sensitive, and infected classnames are long and

fiddly (ZmbM_CitizenASkinny, ZmbF_JournalistNormal). Get one wrong and the test never matches. When you only need "was it an animal", it is safer to check the Killer and the position than to guess at name spellings.

  • Killer is empty for every death a player did not cause — infected fighting

each other, animals, vehicles, the environment. Always guard the reward with Is Valid.

  • The Creature pin is an entity, not a player. Player-only nodes will not

accept it; use the entity nodes (Get Entity Position, Get Entity Type, Get Entity Health) on it.

  • Infected die constantly on a busy server. Keep the chain short, and avoid

broadcasting to everyone on every kill.

  • Server-side only. A kill counter drawn on the killer's own screen has to

travel through Send Client Message into On Client Message in a Server + Client project.

Events/Gear

On Held Item Changed

eventserverevent.handsItemChanged

Fires when a player changes what they are holding. Item is what they are holding NOW — empty when they just put their hands away. Use "Is Valid" to tell the difference.

Outputs
(exec)exec
Playerplayer
Itementity

Fires whenever what a player is holding changes. Drawing a rifle, swapping to a bandage, putting a can down, emptying the hands entirely — all of them come through here, with the player and whatever is in their hands *now*.

That last word matters. The Item pin is the new contents of the hands, not the thing that left them, so putting your hands away fires the event with an empty Item. One event covers both "picked something up" and "put it away", and telling them apart is a Is Valid check on Item.

It runs on the server, so a mod using it needs no install on players' machines.

When to use it

Reacting to what someone is holding: warning when a weapon comes out in a safe zone, showing a hint the first time a special item reaches the hands, logging weapon draws. It is not a pickup event — moving an item from a backpack into a vest never touches the hands, and never fires this. For gear being worn, On Item Attached and On Item Detached. To read the hands on demand instead of reacting, Get Item In Hands.

Pins

Item — what is held now, or empty when the hands were just cleared. Always test with Is Valid before using it. It is a live item, not a classname — use Get Entity Type for that.

Example

Telling a player what they just drew: On Held Item ChangedIs Valid (Item) → Branch. True → Get Display Name (Item) → Join Text with "Now holding: " → Send Chat Message to the event's Player. False is left unwired, because empty hands need no announcement.

For a rule rather than a hint, replace the tail: Get Entity Type (Item) → Switch On Text (Match 1 "M4A1") → Case 1 → Send Notification ("Safe Zone", "Weapons are not allowed here.").

Watch out

  • Empty hands are normal, not an error. Wire Is Valid on Item before anything reads it, or the chain quietly runs on nothing every time somebody holsters.
  • This fires a lot — every swap, every draw, every holster, for every player. Keep the work under it small. A big loop or a chain of Delay waits hung off it multiplies fast on a busy server.
  • Your own graph triggers it. Anything Give Weapon or Give Item To Player puts into the hands fires this event, so a chain that reacts by giving something else can chase itself. Guard it.
  • It fires as a character spawns in and their starting gear settles, so "held something" is not the same as "chose to hold something".
  • Classnames are case-sensitive when you compare them: "M4A1", not "m4a1".

On Item Attached

eventserverevent.itemAttached

Fires when a player puts something on or attaches it (clothing, a backpack, a scope on their rifle). Slot is the attachment point name, e.g. "Body", "Backpack", "weaponOptics".

Outputs
(exec)exec
Playerplayer
Itementity
Slotstring

Fires when a player puts something on. It rides the player's own attachment hook — the same notification the game itself uses to react to gear appearing in a slot — so you get the player, the item that arrived, and the name of the slot it went into.

Attachment is a specific idea in DayZ, and it is narrower than "picked up". A jacket going onto the body, a backpack onto the back, a plate into a vest: those are attachments and they fire this. A can of beans dropped into that backpack is cargo, not an attachment, and never touches this event.

Everything here runs on the server, so a mod built from it works without players installing anything.

When to use it

Reacting the moment gear changes: sealing a suit when the mask goes on, banning a piece of clothing in a safe zone, logging who equipped what. To react to it coming off again, On Item Detached. For what is in the hands rather than worn, On Held Item Changed. And when you want to *ask* what is worn right now rather than be told when it changes, Get Attachment In Slot reads a slot on demand.

Pins

Item — the live item, not its classname. Read the classname with Get Entity Type, or a readable label with Get Display Name.

Slot — the engine's own name for the attachment point, as text. Slot names are exact and case-sensitive.

Example

Confirming a mask went on: On Item AttachedGet Entity Type (Item) → Switch On Text (Match 1 "GasMask") → Case 1 → Send Notification ("Filter Engaged", "Your mask is sealed.") with the event's Player wired in so only that person sees it. Default is left unwired, so every other piece of gear passes through silently.

Watch out

  • Slot names are exact and case-sensitive, and an unrecognised one simply never matches — nothing warns you. If you are unsure of a name, wire Slot straight into Log Message once, put the item on in game, and read it out of the server log.
  • Worn is not the same as carried. This event only fires when something lands in a slot, so a gasmask stuffed in a backpack never trips it — and never protects anyone either. To search the whole inventory instead, use Has Item In Inventory or Find Item On Player.
  • Your own graph trips it too. Anything equipped by Equip Item On Player, Attach New Item or Give Weapon fires this event exactly like a player's own action, so a chain that reacts by equipping something else can chase its own tail. Guard it with a check, or with Do Once.
  • Classnames are case-sensitive when you compare them: "GasMask", not "Gasmask".
  • It fires during spawn-in as the character's starting gear is put on, so "on attach" is not the same as "the player chose to wear this".

On Item Detached

eventserverevent.itemDetached

Fires when a player takes something off or detaches it.

Outputs
(exec)exec
Playerplayer
Itementity
Slotstring

The mirror of On Item Attached: it fires when something leaves one of the player's attachment slots. You get the player, the item that came off, and the name of the slot it left. As with attaching, this is about slots only — pulling a can of beans out of a backpack is a cargo move and does not fire it.

It runs on the server, so nothing needs installing on players' machines.

When to use it

Undoing whatever you granted when the gear went on, and catching people taking off something your rules require. Pair it with On Item Attached and match on the same Slot name from both. To read what is worn at a given moment instead of reacting to a change, use Get Attachment In Slot.

Pins

Item — the live item that was removed. It still exists; it just is not in that slot any more. Read its classname with Get Entity Type.

Slot — the attachment point it left, exact and case-sensitive.

Example

Warning a player who takes their mask off in a bad place: On Item DetachedGet Entity Type (Item) → Text Equals ("GasMask") → Branch → True → Send Notification ("Mask Off", "You are breathing the air here.") with the event's Player, and Give Disease if you want teeth behind the warning.

Watch out

  • Where the item went next is not reported, and is not settled at the moment this fires. Do not assume it landed in hands, in a bag, or on the ground — if that matters, check later with Get Item Container rather than reading it here.
  • Your own graph fires it as well. Clear Inventory, Remove Items Of Type and Delete Entity all pull gear out of slots, so a chain that reacts to a removal by handing the item back can loop endlessly. Gate it.
  • Slot names are exact and case-sensitive; a typo matches nothing and reports nothing. Log the Slot once in game to confirm the spelling.
  • Classnames are case-sensitive too: "GasMask", not "Gasmask".
  • Removing something is not the same as losing it. A player swapping one jacket for another fires this and then On Item Attached within the same breath, so "took their armour off" and "changed armour" look identical unless you check what went on afterwards.

Events/Interactions

On Hold Interaction

eventclientevent.holdInteraction

Adds a "hold F" action to a world object. Fires when the hold completes. Shows a progress bar and fires only if the player holds the full time. Target is the object they used. Show When decides whether the prompt appears at all — wire any true/false value into it (e.g. Is Item Of Type + Get Item In Hands to require a tool). Leave it alone to always show. It controls the PROMPT, so anything that must be enforced belongs in the flow below as well. Requires players to have the mod.

Inputs
Show Whenbooloptional
Outputs
(exec)exec
Playerplayer
Targetobject
Settings
Object ClassclassnamePickerrequired
Prompt Texttext · default "Search"required
Hold Secondsnumber · default 5required

The same generated "F" prompt as On Press Interaction, but the player has to hold the key down. A progress bar fills for the number of seconds you set, and only when it fills does the flow below run — this is the shape vanilla uses for searching a wreck or dismantling a fence. Let go early, walk away, or take a hit, and the action cancels with nothing run at all.

The prompt lives on the player's machine, so this event needs a "Server + Client" project and players who have the mod. The flow underneath still runs on the server, so server nodes work under it normally.

When to use it

Anything that should feel like work: searching a stash, looting a special container, activating a beacon. The wait is also the balance knob — five seconds standing still in the open is a real cost. For an instant press, use On Press Interaction. To act on the item in the player's hands instead, use On Hold Item Action.

Pins

Show When — optional true/false that decides whether the prompt is offered at all. Checked while the player is looking at the object, so it can only read the Player, the Target and value nodes.

Target — the object they searched, as a plain world object. Feed it through As Item before wiring it into anything that wants an item or entity; that is empty for objects that are not items.

Hold Seconds — how long the bar takes. The player is locked in a full-body animation for the whole time, so keep it in the seconds, not the minutes.

Example

A searchable sea chest that restocks itself: On Hold Interaction (Object Class SeaChest, Prompt Text "Search", Hold Seconds 5) → As Item on Target → Spawn Item In Cargo (Container = that item, Item Class Rag) → Send Notification ("Search", "You found a rag").

Feeding the chest through As Item is the part people miss: Target is a world object, and the Container pin wants an entity. Add a Show When of Get Item In HandsIs Item Of Type (Item Class Screwdriver) and the prompt only offers itself to players carrying a tool in hand.

Watch out

  • The object class must match exactly — the world variants compare the object's own type, so Barrel_Green does not cover Barrel_Red. Only the held-item versions match subtypes.
  • Classnames are case-sensitive.
  • Cancelling runs nothing. There is no "started" path, so a graph cannot charge a fee up front and refund it.
  • Players need the mod; a "Server only" project rejects this node and players without the client half never see the prompt.
  • The prompt appears only while standing or crouching and looking at the object from normal use range. Prone players get nothing.
  • Show When is evaluated on the player's machine, where server memory does not exist — Get Global Number, Get Saved Number and Get Player Number read as their starting value there. Use it to hide the prompt from people who obviously cannot use it, and enforce the real rule below with Branch.
  • A long hold on a container players can also open normally is a race: they can open the chest by hand while your bar is filling.

On Hold Item Action

eventclientevent.holdItemInteraction

Adds a hold-to-complete action to an item the player is HOLDING. Shows a progress bar and fires only if they hold the full time. Item is the item in their hands. Subtypes match too. Show When decides whether the prompt appears at all — wire any true/false value into it (e.g. Is Item Of Type + Get Item In Hands to require a tool). Leave it alone to always show. It controls the PROMPT, so anything that must be enforced belongs in the flow below as well. Requires players to have the mod.

Inputs
Show Whenbooloptional
Outputs
(exec)exec
Playerplayer
Itemitem
Settings
Item ClassclassnamePickerrequired
Prompt Texttext · default "Use"required
Hold Secondsnumber · default 3required

The held-item action with a timer on it. While the player holds an item of the class you name, your prompt appears; holding the key fills a progress bar for the seconds you set, and only a completed bar runs the flow below. Releasing early, moving off, or being interrupted cancels it and nothing happens.

Like On Press Item Action it works on the item in their hands, and the Item output is that item, item-typed and ready for the item nodes. Like every interaction node it draws a prompt on the player's screen, so it needs a "Server + Client" project and players who have the mod; the flow underneath still runs on the server.

When to use it

Anything that should read as effort or craft: field-stripping a weapon, brewing something, converting one item into another. The hold time is your balance knob, and the cancel-on-interrupt behaviour means it cannot be done mid-fight. For an instant use, On Press Item Action. For a prompt on a placed object instead of a held item, On Hold Interaction.

Pins

Show When — optional true/false that decides whether the prompt is offered at all. Checked while the item is in hand, so it can read the Player, the Item and value nodes on them.

Item — the held item, item-typed.

Hold Seconds — how long the bar takes. The player is locked in the animation for the whole time; a few seconds reads as work, half a minute reads as a bug.

Example

Tearing a rag into a proper bandage: On Hold Item Action (Item Class Rag, Prompt Text "Make bandage", Hold Seconds 3) → Remove Items Of Type (Container = Player, Item Class Rag, How Many 1) → Give Item To Player (BandageDressing, Player) → Send Notification ("Crafted", "You made a bandage").

The Player pin takes the event's Player straight into the Container pin — a player is an entity, and Remove Items Of Type searches their whole inventory. Take the ingredient first and hand out the result second, so a full inventory cannot leave the player with both.

Watch out

  • Subtypes match. The class you name catches everything descended from it, so choose the leaf class when only one variant should qualify.
  • Classnames are case-sensitive.
  • Cancelling runs nothing at all — there is no "started" path, so you cannot take payment up front.
  • Hands only: an item in a bag or a pocket offers no prompt.
  • Players need the mod; a "Server only" project rejects this node.
  • Show When is checked on the player's machine, where server-side memory does not exist — Get Global Number, Get Saved Number and Get Player Number read as their starting value there. Hide the prompt with client-visible facts, then re-check the real rule below with Branch.
  • The held item is not consumed for you. Remove or change it in the flow if the action is meant to use it up.

On Press Interaction

eventclientevent.pressInteraction

Adds a "press F" action to a world object. Fires when a player uses it. Set the object class to target (e.g. a specific crate or structure). Target is the object they used. Show When decides whether the prompt appears at all — wire any true/false value into it (e.g. Is Item Of Type + Get Item In Hands to require a tool). Leave it alone to always show. It controls the PROMPT, so anything that must be enforced belongs in the flow below as well. Requires players to have the mod.

Inputs
Show Whenbooloptional
Outputs
(exec)exec
Playerplayer
Targetobject
Settings
Object ClassclassnamePickerrequired
Prompt Texttext · default "Use"required

Adds a brand-new "press F" prompt to a world object. NodeZ writes a real DayZ user action for it and registers it on every player — the same mechanism vanilla uses for opening a door. When a player looks at an object of the class you name, your prompt appears; one press and the flow below runs.

The prompt has to be drawn on the player's own machine, so this event only exists in a "Server + Client" project: players must have the mod. The work underneath still runs on the server, so anything you wire below — giving items, spawning, saving numbers — behaves exactly as it does under an ordinary server event.

When to use it

Instant use of something placed in the world: a supply barrel, a shrine, a wall panel. When the action should take time and show a progress bar, use On Hold Interaction. When you want to act on the item in the player's hands rather than on something in the world, use On Press Item Action or On Hold Item Action. If all you need is "a player reached this place", Player Entered Zone does that with no client install at all.

Pins

Show When — optional. Wire any true/false value and the prompt only appears while it is true. It is re-checked while the player looks at the object, so it can only use what exists at that moment: the Player, the Target, and value nodes reading them.

Target — the object they used, as a plain world object. Item and container nodes want an item or an entity, so pass it through As Item first. That comes back empty for anything that is not an item — a building or a fence never is.

Object Class — the exact class of the object, from the panel picker. Prompt Text — the words shown beside the key.

Example

A resupply barrel: On Press Interaction (Object Class Barrel_Green, Prompt Text "Take supplies") → Give Item To Player (BandageDressing, Player wired from the event) → Send Notification ("Supplies", "You took a bandage").

To show the prompt only to players holding a Rag, wire Get Item In Hands (Player) → Is Item Of Type (Item Class Rag) into Show When. That only hides the prompt, so repeat the same check below with Branch when the rule must actually be enforced.

Watch out

  • The object class must match exactly. Unlike the held-item versions, the world ones compare the object's own type, so subtypes do not count: a graph aimed at Barrel_Green ignores Barrel_Red.
  • Classnames are case-sensitive, here as everywhere.
  • Players need the mod installed. A "Server only" project rejects this node, and players without the client half simply never see the prompt.
  • The prompt appears only while standing or crouching and looking at the object from normal use range. A prone player gets nothing.
  • Show When is evaluated on the player's machine, where server-side memory does not exist. Get Global Number, Get Saved Number and Get Player Number read as their starting value there, so a condition built on them will not do what you expect. Test what the player's own machine can see and enforce the rest in the flow below.
  • Several interaction nodes aimed at the same class each add their own prompt; they stack in the list rather than replacing one another.

On Press Item Action

eventclientevent.pressItemInteraction

Adds an action to an item the player is HOLDING. Fires when they use it. Works on the item in their hands, not a world object — Item is that item. Subtypes match too. Show When decides whether the prompt appears at all — wire any true/false value into it (e.g. Is Item Of Type + Get Item In Hands to require a tool). Leave it alone to always show. It controls the PROMPT, so anything that must be enforced belongs in the flow below as well. Requires players to have the mod.

Inputs
Show Whenbooloptional
Outputs
(exec)exec
Playerplayer
Itemitem
Settings
Item ClassclassnamePickerrequired
Prompt Texttext · default "Use"required

Gives an item a new use. While the player is holding an item of the class you name, your prompt appears with the other action prompts; one press and the flow below runs. This is the shape vanilla uses for the small in-hands actions — emptying a seed pack, breaking a stick — and NodeZ generates one of those actions per node.

It fires on the item in their hands, not on anything in the world and not on what is in their pockets. The Item output is that held item, ready to wire straight into item nodes.

When to use it

Turning an ordinary item into a tool of your own: a radio that calls a heli, a can that trades for a reward, a map piece that reveals a location. When the use should take time and show a progress bar, use On Hold Item Action. When the prompt belongs on something placed in the world instead, use On Press Interaction. To react to an item being consumed the normal way, On Player Consumed already exists — you do not need an action for that.

Pins

Show When — optional true/false deciding whether the prompt is offered. Checked while the item is in hand, so it can read the Player, the Item, and value nodes on them.

Item — the held item. This one is item-typed, so it feeds Set Item Quantity, Set Item Health and the rest directly, with no conversion.

Item Class — the class the prompt attaches to. Prompt Text — the words shown beside the key.

Example

A canteen you can purify by hand: On Press Item Action (Item Class Canteen, Prompt Text "Purify") → Set Container Liquid (Container = the event's Item, Liquid "Clean Water") → Send Notification ("Purified", "The water is safe to drink").

Add a Show When of Get Container Liquid on the Item → Text Equals ("Water") and the prompt only appears when there is dirty water in there to clean.

Watch out

  • Subtypes match here. The held-item versions accept anything descended from the class you name, so a base class catches every variant. Pick the exact leaf class when you want only one.
  • Classnames are case-sensitive.
  • Players need the mod. The node is rejected in a "Server only" project, and players without the client half never see the prompt.
  • Hands only. An item in a backpack or a pocket has no prompt — that is the same worn-versus-carried split you meet with Find Item On Player.
  • The prompt shows while standing or crouching; a prone player gets nothing.
  • Show When runs on the player's machine, where server-side memory is not filled in: Get Global Number, Get Saved Number and Get Player Number all read as their starting value there. Hide the prompt with what the client can see, then re-check the real rule below with Branch.
  • The prompt does not consume anything by itself. If the item is meant to be used up, delete it yourself with Remove Items Of Type or Delete Entity in the flow.

Events/Networking

On Client Message

eventclientevent.onClientMessage

Fires on the player's client when the server sends a message with this name. Carries up to 3 texts + 2 numbers + an on/off flag. Wire the slots you need. Requires the mod on the client (server+client project).

Outputs
(exec)exec
Text 1string
Text 2string
Text 3string
Number 1float
Number 2float
On / Offbool
Settings
Messagetext · default "message"required

The receiving half of NodeZ's server-to-client radio. The server raises a named message with Broadcast Client Message (everyone) or Send Client Message (one player), and every On Client Message node listening for that exact name fires on the player's own machine with the payload on its pins.

This is what makes a HUD possible. Almost everything worth showing — who just died, the score, how long the round has left — is known only to the server, while every HUD node draws on the player's client. The payload is a fixed envelope: three texts, two numbers, one on/off flag. Wire the slots you need and the rest arrive blank. Only plain values cross the wire, so when the client needs to know about a player, send their name or Steam ID as text.

When to use it

Every client-side reaction to something the server decided: killfeeds, scoreboards, round timers, warning banners, showing and hiding an overlay. Under it you can use the whole HUD family — Show HUD Overlay, Add Widget From Layout, Set Text — which is client-only and cannot run under a server event at all. To put a line of text in front of a player without building UI, Send Notification does that from the server with no client half.

Pins

Message — the name to listen for, matched exactly against the name the sender used. Case and spacing matter and a mismatch is silent, so the editor warns when a Broadcast or Send names something nothing listens for.

Text 1-3 / Number 1-2 / On / Off — the envelope. Give each slot a job and keep sender and receiver in step; nothing labels them for you.

There is no Player pin and none is needed: the handler runs on the receiving player's own machine, so "the player" is always whoever is looking at the screen.

Example

A killfeed. On the server: On Player DiedIs Valid (Killer) → Branch; on True, Broadcast Client Message named "kill", with Text 1 = Get Player Name (Killer) and Text 2 = Get Player Name (Victim).

On the client: On Client Message ("kill") → Show HUD Overlay (your killfeed layout) → Scale For Screen on the Root → Add Widget From Layout (a row layout) into that Root → Find Child Widget ("line") → Set Text with Join Text of Text 1, " killed ", Text 2 → Auto-Destroy Widget After (8 seconds). Every client builds its own copy of the line from the strings it received.

Watch out

  • This is a client node: the project must be set to "Server + Client" in Project Settings and players must have the mod installed. A server-only install runs the server half happily and the HUD is simply never there — no error, no clue.
  • Sender and receiver are matched by name only, so renaming one side quietly kills the feature. The editor's "nothing listens for this" warning is the safety net.
  • Every listener with a matching name fires, on every client that received the message. Use Send Client Message when only one player should react.
  • Server-side values cannot be read here. Saved numbers (Get Saved Number, Get Saved Player Number) live in a file on the server and read back 0 on a client — put the number in the envelope instead.
  • HUD sizes are real screen pixels and layouts are drawn for 1080p, so run Scale For Screen immediately after showing an overlay or adding a widget, and set text before measuring with Fit Widget To Text.

Events/Player

On Item Injected

eventserverevent.itemApplied

Fires when a player injects something into themselves or someone else. Player is who received it, which is not always who used it. Check the Item with Get Entity Type to tell morphine from epinephrine. Vanilla injectables are Morphine, Epinephrine and AntiChemInjector — eating and drinking go through On Player Consumed instead.

Outputs
(exec)exec
Playerplayer
Itemitem

Fires on the server when someone finishes injecting an item — into themselves or into another player. It rides OnApply on ItemBase, the call vanilla's inject actions make once the needle has gone in, so it covers Morphine, Epinephrine and AntiChemInjector, plus any modded item that uses the same injectable action.

Read the Player pin as "who received the dose". For a self-injection that is the person holding the syringe; for a rescue injection it is the patient, not the medic. The node does not tell you who administered it.

When to use it

Custom medical effects — an epinephrine shot that also stops bleeding, morphine that costs stamina, an anti-chem injector that clears a stack of your own status flags. Eating and drinking do not come through here; that is On Player Consumed. Bandages, splints and other applied-but-not-injected items are not on this hook either.

Pins

Item — the injector that was used. One event covers every injectable, so this is how you tell them apart: Get Entity Type gives the classname, or Is Item Of Type tests it directly.

Player — who received it.

Example

Make epinephrine do more: On Item InjectedIs Item Of Type (Item, "Epinephrine") → Branch. The True arm runs Stop All Bleeding on the Player, Set Player Stamina (100), and Send Notification ("Adrenaline", "Your heart is racing.", 6 seconds) aimed at the Player.

Charging for the shot is the same shape with Branch reversed: check Get Player Number for a cooldown you set with Set Player Number, and only apply the bonus when it has expired.

Watch out

  • Classnames are exact and case-sensitive — "Epinephrine", not "epinephrine",

"AntiChemInjector" with that capitalisation. A wrong-case compare simply never matches, silently and forever.

  • The event fires after the vanilla effect has been applied, so your changes sit

on top of what the injection already did. Setting health or stamina here overwrites the engine's own result rather than adding to it.

  • Server-side. To put something on the injected player's screen, send it with

Send Client Message and draw it under On Client Message in a Server + Client project.

  • The injector is generally used up by the action, so the Item is not a handle

worth keeping. Read what you need from it inside this chain rather than stashing it with Remember Item, which reads back empty once the item is gone.

On Player Connected

eventserverevent.playerConnected

Fires when a player joins the server (new or returning character). Also fires right after a respawn creates the new character.

Outputs
(exec)exec
Playerplayer
Identityidentity

Fires on the server the moment a player's character has been created and loaded into the world. It rides the same vanilla hook the server uses to announce a finished connection (InvokeOnConnect in MissionServer), so it covers both a brand-new character and a returning one — and it fires again right after a respawn creates the new character.

Think of it as "a character just arrived", not "a person just clicked Join". The character exists and the Player pin is live, but the client may still be on the loading screen.

When to use it

Connect logging, welcome messages, and per-player bookkeeping that should run as early as possible. For anything that physically touches the character — giving items, teleporting, healing — prefer On Player Ready, which fires a little later at the guaranteed-safe point, or put a short Delay after this event. Use On Player Respawned when you care about the respawn *decision* itself, and On Player Left / On Player Disconnecting for the way out.

Pins

Player — the character that just arrived. Everything downstream hangs off this.

Identity — the engine's network identity record for the connection. Almost every graph only needs Player; values like name and Steam ID come from Get Player Name and Get Player Steam ID on the Player pin.

Example

The simplest form is two nodes: On Player ConnectedSend Notification ("Welcome!", "This server runs NodeZ", 10 seconds), with the event's Player wired into the notification so only the arriving player sees it. The server-log version is the same shape — On Player ConnectedGet Player NameJoin Text ("joined: " + name) → Log Message.

The full treatment splits the work: On Player ConnectedSequence. Then 0 compares the player's saved round_id against the server's saved current_round_id and, when they differ, zeroes their round_kills and round_deaths — so stats reset once per round, not on every reconnect. Then 1 runs Delay (2 seconds, carrying the Player) → the loadout hand-out, which is only safe once the client has finished loading. The bookkeeping lands instantly, the kit waits.

Watch out

  • This event fires again after every respawn, because a respawn creates a new

character. Anything meant to happen once per visit needs its own gate — the saved round id above is one way; a per-player flag via Set Player Number also works.

  • Don't equip or teleport the character directly under this event. The client

can still be loading; wait with Delay (about 2 seconds) or use On Player Ready instead.

  • After a Delay, only the carried Player survives into the Then path.

Re-derive everything else from it.

On Player Consumed

eventserverevent.playerConsumed

Fires when a player eats or drinks something. Item is empty when drinking from a pond, well, or snow. Amount is how much was consumed.

Outputs
(exec)exec
Playerplayer
Itemitem
Amountfloat

Fires on the server when a player eats or drinks. It rides Consume on PlayerBase — the single call every vanilla eat and drink action funnels through — so canned food, fruit, cooked steak, a canteen, a soda and a mouthful of pond water all arrive here.

The node runs after the engine has already applied the food or water, and it hands the original result straight back, so vanilla nutrition is untouched. Your chain is an addition on top, not a replacement.

When to use it

Custom food effects — a can of beans that also warms you up, alcohol that blurs a stat, poisoned water in one region. Injections are a different hook: use On Item Injected for Morphine, Epinephrine and AntiChemInjector.

Pins

Item — what was consumed. Empty when the player drank straight from a pond, a well or snow, because there is no item involved — check with Is Valid before reading it. Otherwise Get Entity Type or Is Item Of Type tells you which food it was.

Amount — how much the engine took in that consume step, in the item's own quantity units. A long drink reports its own amount; it is not a percentage and not the item's remaining quantity (Get Item Quantity gives that).

Example

Unsafe pond water: On Player ConsumedIs Valid (Item) → NotBranch. The True arm — nothing consumed, so it was a pond, a well or snow — runs Random Chance (25 %) → a second BranchGive Disease (Cholera, Strength 150) on the Player and Send Notification ("That tasted wrong", "You should have boiled it.", 6 seconds).

A warming meal is the mirror image: Is Item Of Type (Item, "BakedBeansCan") → BranchGive Energy on the Player.

Watch out

  • Classnames are exact and case-sensitive: "BakedBeansCan", not

"bakedbeanscan". A wrong-case test never matches and never complains.

  • Item is empty for drinking from the world, and that is a normal case, not an

error. Always guard with Is Valid before feeding it into Get Entity Type or an item node.

  • Eating and drinking is a repeating action, so expect this event more than once

per item rather than once per meal. Keep the chain cheap, and if something should happen only once, latch it with Do Once or a marker set by Set Player Number.

  • Server-side. Anything that has to appear on the eater's own screen goes

through Send Client Message into On Client Message in a Server + Client project.

On Player Died

eventserverevent.playerDied

Fires when a player dies. Killer is the player who killed them, or empty for deaths by infected, animals, or the environment. Use "Is Valid" to check.

Outputs
(exec)exec
Victimplayer
Killerplayer

Fires on the server the moment a player's character is killed. It rides EEKilled on PlayerBase — the engine's own death notification, the same one vanilla's admin log listens to — so it covers every death: shot, beaten, mauled, starved, fallen.

The Killer pin does real work for you. What the engine hands over is the *source object*, and for a shooting that object is the weapon, not the person. The node walks up from the source to whoever is holding it, falls back to the source itself when there is no weapon in the way (fists, a vehicle), and then blanks the result if it turns out to be the victim. So Killer is only ever another player — never the gun, never the victim themselves.

When to use it

Killfeeds, kill rewards, death penalties, scoreboards, drop-on-death rules. For infected and animals use On Creature Killed; that is a separate hook and this node never fires for them. For the hits leading up to the death — or to build a last-attacker record — use On Player Took Damage. To react to the player coming back, use On Player Respawned.

Pins

Victim — the character that just died. Always valid.

Killer — the other player responsible, or empty. Always test it with Is Valid before you read a name or hand out a reward.

Example

Reward the killer and tell them who they got: On Player DiedIs Valid (Killer) → Branch. The True arm runs Give Item To Player (Rag) aimed at the Killer, while Get Player Name on the Victim goes through Join Text ("You killed " + the name) into the detail of a Send Notification sent to the Killer. That wiring is the Kill reward template (File → New from template) if you would rather start from it than build it.

For a persistent scoreboard, add Add To Saved Player Number on the Killer ("kills" + 1) in the same True arm, and Add To Saved Player Number on the Victim ("deaths" + 1) outside the branch, so deaths count even when nobody killed them.

Watch out

  • Plenty of deaths have no killer: bleeding out, falls, starvation, infected,

animals, and respawning from the menu. The Killer pin is also deliberately emptied for self-inflicted deaths. Guard the reward arm with Is Valid, or you hand items to nobody.

  • If credit still matters for those deaths, keep your own record — under

On Player Took Damage stamp the attacker's Steam ID onto the victim with Set Player Text, and read it back here with Get Player Text.

only sets that flag for the "Brain" damage zone — a graze across the head model does not count.

Set Player Text live on that character object. The respawn builds a new one, so a kill streak kept that way resets on death by design; use Add To Saved Player Number when it must survive death and restarts.

  • The corpse stays in the world for a while and still counts as a player, so

For Each Player and For Each Player Near will visit it. Gate those loops with Is Player Alive when a body must not take part.

On Player Disconnecting

eventserverevent.playerDisconnecting

Fires the moment a player starts to disconnect. Runs before their character is saved (unlike On Player Left, which runs at the end). The player is still in the world here.

Outputs
(exec)exec
Playerplayer
Identityidentity

Fires on the server the instant a logout begins — the player has hit Disconnect, the countdown has started, and the character is still standing in the world. It rides OnClientDisconnectedEvent in MissionServer, which vanilla raises before the character is saved.

That is the difference between this node and On Player Left. Here the body is still real: you can damage it, move it, strip it, or note exactly where it stood. By the time On Player Left runs, the player is gone and only bookkeeping is left.

When to use it

Combat-logging rules (kill or punish a player who quits during a fight), saving a logout position, dropping quest items back on the ground, clearing a "player is in the arena" slot while the character can still be found. Use On Player Left for plain leave logging and totals.

Pins

Player — the character, still in the world and still safe to act on.

Identity — the connection's network record. Names and Steam IDs are easier from Get Player Name / Get Player Steam ID on the Player pin.

Example

Punish a combat log: On Player DisconnectingGet Player Number (Player, in_combat) → Greater Than (B = 0) → Branch, and on the True arm Kill Entity on the Player plus Get Player NameJoin Text ("combat logged: " + name) → Log Message. The in_combat marker is set over in the damage graph — On Player Took DamageSet Player Number (Victim, in_combat = 1).

Watch out

  • Fires at the START of the logout, so the player may still cancel and stay. If

your reaction is destructive, be sure that is what you want — vanilla gives them a countdown, this event does not wait for it.

  • Do not park a Delay here hoping to act later. The wait outlives the

connection, and the continuation stops on its own once the carried player is gone.

Send Client Message) may never be seen — the connection is closing. Log it instead with Log Message or Write To Log File.

Set Player Text) die with it. Copy anything worth keeping into a saved value here with Set Saved Player Number.

On Player Knocked Out

eventserverevent.playerKnockedOut

Fires the moment a player falls unconscious.

Outputs
(exec)exec
Playerplayer

Fires on the server the moment a player drops unconscious. It rides OnUnconsciousStart on PlayerBase, so it covers every cause the engine recognises — a blow to the head, blood loss, shock, overdose — and fires once per blackout, not repeatedly while they are down.

When to use it

Rescue mechanics, downed-player markers, an admin log of who went down where, or a rule that a knocked-out player drops what they were holding. Pair it with On Player Woke Up for anything that has to be undone on recovery. To knock someone out from a graph rather than react to it, use Knock Out Player; to ask whether a player is down right now, use Is Player Unconscious.

Example

Call for help: On Player Knocked OutGet Player NameJoin Text ("Player down: " + name) → Broadcast Notification ("Medic!", the joined text, 10 seconds), with Get Player PositionJoin Text into Log Message on a second wire so admins can find the body.

Watch out

  • Unconscious is not dead. Players wake up on their own, and this event fires

again the next time they go down — anything meant to happen once needs a latch such as Do Once or a marker set with Set Player Number.

  • A knockout often runs straight into a death. Work started here with a

Delay may find the carried player gone; the continuation stops quietly when that happens.

  • Server-side, so HUD nodes cannot hang off it. A blackout overlay on the

player's own screen has to travel through Send Client Message into On Client Message in a Server + Client project.

On Player Left

eventserverevent.playerLeft

Fires when a player has fully left the server. Runs just before their character is saved.

Outputs
(exec)exec
Playerplayer

Fires on the server at the very end of a logout, when the player has finished leaving. It rides InvokeOnDisconnect in MissionServer — the vanilla point just before the character is written to storage — and it is the last moment your graph ever sees that player.

There are two ways out of a server and NodeZ gives you both. On Player Disconnecting fires at the *start* of the logout, while the player is still standing in the world; this one fires at the end, once they are gone. Pick by whether you need to touch the character (use the other one) or just to record that they left (use this one).

When to use it

Leave logging, session bookkeeping, writing a play-time total to a saved value, clearing a global that tracked "who is in the arena". For combat-logging rules — killing or punishing someone who quits mid-fight — use On Player Disconnecting instead; by the time this event runs it is too late to act on the body.

Pins

Player — the departing character. Still readable, but on its way out: read what you need immediately rather than after a Delay.

Example

Record the session: On Player LeftGet Player NameJoin Text ("left: " + name) → Log Message, with a second wire from the event into Add To Saved Player Number ("sessions" + 1) so the count survives a restart.

Watch out

  • The connection is already tearing down, so anything that needs the player's

network identity can come up empty here. Nodes that message a client — Send Notification, Send Chat Message, Send Client Message — have nobody left to talk to.

  • Do not put a Delay between this event and your work. The continuation

checks that the carried player still exists and quietly stops when they do not, which after a logout is exactly what happens.

Set Player Text vanish with the character. If a running total should survive the logout, write it here with Add To Saved Player Number.

On Player Ready

eventserverevent.playerReady

Fires once a player has fully loaded in and is ready to play. Later than On Player Connected — the safe point for anything that touches the live character (give items, teleport, heal).

Outputs
(exec)exec
Playerplayer
Identityidentity

Fires on the server once a player's client has finished loading and the character is actually in the game. It rides OnClientReadyEvent in MissionServer — vanilla's own "this player is now playing" signal — which comes a little later than On Player Connected.

That later timing is the whole point of the node. Under On Player Connected the character exists but the client can still be sitting on the loading screen, so gear handed over then may never reach it. Here the client is caught up, and it is safe to touch the character directly: give items, teleport, heal.

When to use it

Spawn kits, starting loadouts, moving arrivals to a lobby — anything the player must actually see on their body or their screen. Use On Player Connected instead for bookkeeping you want as early as possible (logging a join, reading saved stats), and On Player Respawned when you care about the respawn decision rather than the arrival.

Pins

Player — the loaded character. Everything downstream hangs off this pin.

Identity — the engine's network record for the connection. Most graphs never touch it; a name or Steam ID is easier from Get Player Name and Get Player Steam ID on the Player pin.

Example

A starter kit in one chain: On Player ReadyClear InventoryGive Weapon (M4A1 with Mag_STANAG_30Rnd) → Give Item To Player (BandageDressing) → Delay (2 seconds, carrying the Player) → Set Quick Bar Slot with the rifle found again by Find Item On Player ("M4A1") into slot 1. The wait is there because the quick bar points at an item on the player's own machine, and the client needs a moment to receive what you just created.

Watch out

  • This event runs on the server, so client-only nodes — everything hud*

cannot hang off it. To paint something on the arriving player's screen, send them a message with Send Client Message and build the HUD under On Client Message; that also means the project must be set to Server + Client and players must have the mod.

  • Teleporting and equipping in the same instant desyncs: the player looks naked

to everyone else. Put roughly 2 seconds of Delay between Teleport Player and the gear, and finish with Resync Player Gear.

  • After a Delay only the carried Player survives into the continuation.

Re-derive anything else from it, or stamp it on the player first with Set Player Number / Set Player Text and read it back.

On Player Respawned

eventserverevent.playerRespawned

Fires when a player chooses to respawn (their old character just died).

Outputs
(exec)exec
Playerplayer
Identityidentity

Fires on the server when a player clicks Respawn on the death screen and the engine builds them a fresh character. It rides OnClientRespawnEvent in MissionServer, so it is the respawn *decision* — the old body is already dead and the new one has just been created.

The Player pin is the new character, not the corpse. That matters more than it sounds: anything you stamped on the old character with Set Player Number or Set Player Text lived on that object and is gone. Only Set Saved Player Number and Set Global Number carry across.

When to use it

Fresh-spawn kits, moving new lives to a spawn point, resetting per-life counters, counting how many times someone has respawned. On Player Ready is the better home for gear on a normal join; On Player Connected fires here too, because a respawn creates a character, so put "once per life" work in one of these two events and not both.

Pins

Player — the newly created character.

Identity — the connection's network record. Rarely needed; names and Steam IDs come from Get Player Name / Get Player Steam ID on the Player pin.

Example

A respawn kit that lands where you want it: On Player RespawnedAdd To Saved Player Number ("lives" + 1) → Delay (2 seconds, carrying the Player) → Teleport Player (7500 0 7500) → Delay (2 seconds) → Give Item To Player (BandageDressing) → Resync Player Gear. The first wait lets the new character settle, the second keeps the teleport and the gear apart.

Watch out

  • The character has only just been created. Equipping or teleporting in the

same instant can leave the player looking naked to everyone else — wait about 2 seconds with Delay and finish with Resync Player Gear.

  • Per-player session values do not survive respawn: they live on the character

object, and this is a new one. Use Set Saved Player Number for anything that must outlast a death.

players on connect will greet them again on every respawn unless you gate it.

  • After a Delay only the carried Player survives — re-derive everything

else from it rather than trusting a global, which another player's respawn can overwrite while you wait.

On Player Took Damage

eventserverevent.playerTookDamage

Fires when a player takes damage. Attacker is empty for damage from infected, animals, or the environment. Hit Zone is like "Head" or "Torso". Damage, Shock and Blood Loss are the three separate pools one hit drains — a bullet that barely dents health can still knock someone out through Shock. Ammo Type is the round that landed, e.g. Bullet_762x39.

Outputs
(exec)exec
Victimplayer
Attackerplayer
Damagefloat
Shockfloat
Blood Lossfloat
Hit Zonestring
Ammo Typestring

Fires on the server every time damage lands on a player. It rides EEHitBy on PlayerBase, the engine's per-hit notification, so it covers bullets, melee, infected claws, animal bites, falls, fire and gas alike — one firing per hit, not one per fight.

Attacker resolution mirrors what the node does on death: the engine passes the *source* of the damage, which for a shooting is the weapon rather than the person, so the node takes the source when it is itself a player and otherwise walks up to whoever is carrying it. A source that resolves back to the victim is blanked, so self-inflicted damage leaves Attacker empty.

One hit drains three separate pools and the node reports all of them for the zone that was struck: Damage is health, Shock is the concussive load that puts people on the floor, and Blood Loss is what bleeds out. They move independently — a round stopped by a plate carrier can cost almost no health and still knock the wearer out on shock alone.

When to use it

Last-attacker records, safe-zone enforcement, armour or resistance effects, combat-logging timers, "you are being shot" warnings. Use On Player Died for the killing blow only — this node fires for every hit, including the fatal one.

Pins

Attacker — the other player who dealt it, or empty for infected, animals, the environment and anything self-inflicted. Check with Is Valid.

Damage — the health taken off by this one hit. It is not the player's remaining health; read that with Get Player Health. Hits that cost only shock or blood report 0 here.

Shock — the unconsciousness load from this hit. This is what body armour usually fails to stop, so a target that survives on health can still be dropped by it. Read the running level with Get Player Shock.

Blood Loss — blood taken by this hit, separate from the bleeding wound it may also open. Get Bleeding Wounds counts the wounds; this is the direct loss. Judge it against the pool a living player actually has: full is 5000 and the fatal line is 2500, so there are only 2500 points between healthy and dead — a few hundred per hit is a lot.

Ammo Type — the round or damage source that landed, spelled as the game names it: Bullet_762x39, Bullet_556x45, MeleeSoft, FallDamage. Exact casing, so compare with Text Equals. This is what tells one calibre from another when you are measuring what actually got through.

Hit Zone — the engine's name for the body part, such as "Head", "Brain", "Torso" or "LeftLeg". Exact spelling and casing, so compare it with Text Equals, not by eye.

Example

A last-attacker record, so a bleed-out can still be credited: On Player Took DamageIs Valid (Attacker) → Branch, and on the True arm Get Player Steam ID (Attacker) → Set Player Text on the Victim under the name last_attacker. Over in the death graph, On Player Died reads it back with Get Player Text whenever its own Killer pin comes up empty.

A ballistics readout, for working out what a loadout actually stops: wire Hit Zone, Damage, Shock and Ammo Type through Join Text into Send Chat Message aimed at the Attacker. Every shot then prints what it hit, what it cost across all three pools, and which round did it — the four numbers you need to compare two sets of armour honestly.

A head-armour rule is the same shape: Text Equals (Hit Zone, "Head") → BranchGet Attachment In Slot (Victim, "Headgear") → Is Valid → heal part of the hit back with Set Player Health.

Watch out

  • This is the busiest event in the library. In a firefight it fires many times

a second, per player — a chain that loops over everyone online or sends a notification on every hit will drag the server down. Filter early with Branch and keep the work small.

  • Attacker is empty far more often than people expect: infected, animals, falls

and gas all arrive with no attacker. Never wire it straight into a reward.

  • Damage of 0 does not mean the hit did nothing. Check Shock and Blood Loss

before concluding armour stopped a round — very often it stopped the health damage and passed the shock straight through.

  • Hit Zone strings are case-sensitive and are not the same list as the headshot

flag: the engine only counts "Brain" as a headshot (Was Killed By Headshot), so a "Head" hit here is not automatically a headshot.

  • Server-side only. To flash something on the victim's screen, send a message

with Send Client Message and draw it under On Client Message in a Server + Client project.

On Player Woke Up

eventserverevent.playerWokeUp

Fires when a player comes back round after being unconscious.

Outputs
(exec)exec
Playerplayer

Fires on the server when a player comes round after being unconscious. It rides OnUnconsciousStop on PlayerBase, the counterpart to the hook behind On Player Knocked Out, and it only fires for players who actually wake up — someone who dies while down never reaches it.

When to use it

Undoing whatever you did on the way down: clearing a downed marker, ending a rescue timer, giving a grace period of invulnerability, telling the player how long they were out. To wake someone up from a graph instead of reacting to it, use Wake Up Player.

Example

A short grace period on recovery: On Player Woke UpSet Player Invulnerable (Invulnerable ticked) → Send Notification ("You are back", "Ten seconds to get to cover.", 8 seconds) → Delay (10 seconds, carrying the Player) → Set Player Invulnerable (unticked).

Watch out

and killed never wakes, so anything switched on down there must also be cleared under On Player Died or it stays on for that character's whole life.

  • After a Delay only the carried Player survives into the continuation.

Re-derive anything else from it rather than reading a global, which another player's blackout can overwrite while you wait.

  • Server-side, so a "you passed out" overlay must be sent to the client with

Send Client Message and drawn under On Client Message in a Server + Client project.

Events/Timers

After Delay On Start

eventserverevent.afterDelayOnStart

Runs once, this many seconds after the server starts. Wire the delay from a config value to make it tunable.

Inputs
Delay (seconds)float
Outputs
(exec)exec

Fires exactly once, this many seconds after the server's mission starts, and then never again. It is the same scheduler the repeating timers use, set to run a single time.

The delay is the whole point. "The server started" is not the same as "the world is ready" — zones have to spawn, config has to load, the map has to settle. Giving your one-off setup twenty or thirty seconds of head start avoids a whole family of "it works when I trigger it by hand but not on boot" problems.

When to use it

One-time setup shortly after startup: placing props and stashes, seeding a counter, announcing a wipe. On Server Started is the instant version and runs while the mission is still being built — better for pure bookkeeping, worse for anything that touches the world. For work that repeats, Every N Seconds; for a particular time on the in-game clock, Daily At Time.

Pins

Delay (seconds) — read once when the timer is created, so it takes a typed number or a config value (Get Config Number) and nothing else. Anything computed at runtime is rejected by the generator with a message saying so.

Example

Laying out a stash the server should always have: After Delay On Start (30) → Spawn Item (SeaChest, Position "7500 0 7500") → Tag Item ("stash") → Remember Item ("stash"). Thirty seconds is ample for the world to be up. The tag is how a later sweep tells this crate from any other SeaChest (Get Item Tag); the remembered handle is how a timer graph finds it again without searching (Get Remembered Item).

A wipe announcement that actually gets read: After Delay On Start (120) → Broadcast Notification ("Fresh wipe — all stashes cleared"). At two minutes there are people online to see it; at zero seconds there are none.

Watch out

  • Nobody is online at server start. A chain that expects a player finds none — For Each Player simply does nothing — so welcome messages belong on On Player Ready instead.
  • It fires once per server *start*, which means once per restart. Something that must only ever happen once in the server's life needs a saved flag: check Get Saved Number first and write it after.
  • The delay is measured from mission start, not from when the first player joins.

Daily At Time

eventserverevent.dailyAtTime

Fires once each in-game day when the server clock reaches the set time. Uses in-game time (the day/night clock). If the server starts after the set time, it fires shortly after startup, then once per day thereafter.

Outputs
(exec)exec
Settings
Hour (0-23)number · default 12required
Minute (0-59)number · default 0required

Fires once each in-game day, when the server's day/night clock reaches the hour and minute you set. In-game, not real-world: this is the same clock that decides whether it is dark outside, and it moves at whatever pace your server's time acceleration sets.

Underneath, the generated mod checks the clock once a minute. When the time is at or past your target and the event has not yet fired for that in-game day, the chain runs and the day is marked done. Two consequences are worth knowing. The fire lands within about a minute of the target rather than on the second. And if the server starts *after* the target time, the very first check fires it — roughly a minute after startup — and it then settles into once a day.

When to use it

Scheduled world events pinned to the game's day: a noon airdrop, a dusk horde, a 4 AM cleanup while nobody is around. When you want a fixed spacing in real time instead, use Every N Seconds — an in-game day can pass in an hour of real time on an accelerated server. For a single run after boot, After Delay On Start.

Hour and Minute are panel settings rather than pins: they are baked in when the mod is generated, so they cannot be driven from config or worked out at runtime. Hour is held to 0-23 and Minute to 0-59.

Example

A midday airdrop, announced before it lands: Daily At Time (Hour 12, Minute 0) → Broadcast Notification ("Airdrop inbound") → Random Config Position (your "dropSites" list) → Set Global Position ("drop") → Delay (60 seconds) → Get Global Position ("drop") → Spawn Item (SeaChest) → Tag Item ("drop").

Storing the rolled site before the wait is what makes it work: Random Config Position gives a different answer at every wired use, so reading it again after the delay would drop the crate somewhere other than the place just announced.

An overnight tidy-up is simpler: Daily At Time (Hour 4) → Delete Items In Radius around the arena.

Watch out

  • The clock is the in-game one. Speed it up with Set Time Acceleration and this fires more often in real terms — a 16x server sees "daily" roughly every ninety minutes.
  • Jumping the clock forward with Set Time Of Day past the target time triggers it, because the check only asks whether the clock is at or past the target on a day it has not yet handled.
  • A server that restarts after the target time fires it again shortly after startup. On a server restarting every four hours, a "daily" reward pays out several times a day. Guard it with a saved value: run Get Server Date & Time, compare its Day against Get Saved Number ("last_day"), and only act when they differ.
  • Nobody may be online at 4 AM. That is usually the point, but a notification with no one to read it goes nowhere.

Every N Seconds

eventserverevent.everyNSeconds

Runs over and over on a fixed interval while the server is up. Use a few seconds or more — very small intervals can slow the server. Wire the interval from a config value to make it tunable.

Inputs
Every (seconds)float
Outputs
(exec)exec

A metronome for the server. The generated mod builds a small scheduler that starts when the mission starts and calls this event's chain over and over, forever, at the interval you set. It all runs on the server, so a mod built around it needs nothing installed on players' machines.

Two things about the shape. The first tick lands one full interval *after* server start, not immediately — a 300-second timer does nothing at all for the first five minutes. And there is no player attached: the chain begins with nobody in hand, so it usually starts by finding who it cares about with For Each Player or For Each Player Near.

When to use it

Anything that has to keep happening on a fixed rhythm: sweeping an area, ticking damage in a hazard, restart warnings, periodic announcements. For a single run shortly after boot, use After Delay On Start. For a particular time on the in-game clock, Daily At Time. For something that should follow a player standing somewhere, While Player In Zone is the zone-shaped version and hands you the player already.

Pins

Every (seconds) — read once, when the timer is built at mission start. It takes a typed number or a config value (Get Config Number) and nothing else; a runtime source is rejected by the generator with a message saying exactly that, because there is no runtime yet when the timer is created.

Example

An arena tick that punishes stragglers: Every N Seconds (10) → For Each PlayerIs Player AliveBranch; on True, Get Player PositionDistance Between (that and "7500 0 7500") → Greater Than (400) → a second BranchSend Notification ("Return to the arena") and Damage Entity (10).

The alive check earns its place: bodies stay in the engine's player list until they despawn, so without it a corpse lying outside the ring is "punished" on every tick for minutes.

The tunable form drops the literal. Add a config number called "tickSeconds" and wire Get Config Number into the interval — server owners then change the pace in config.json without ever opening the editor.

Watch out

  • Keep the interval sensible. Everything under the event runs inside one tick, and a heavy chain — a loop over every player that does real work — on a one-second timer costs the server that work every second, forever. A few seconds is the sane floor, and the editor will not accept less than 1.
  • The interval is fixed for the life of the server. Changing it means changing the config and restarting.
  • Timers keep running whether or not anyone is online. An empty player loop is cheap; a Spawn Item on a timer quietly fills an empty server with loot.
  • A corpse is still a player. Gate loops on Is Player Alive whenever a body must not count.
  • Nothing carries between ticks. To remember something from last time, store it with Set Global Number and read it back with Get Global Number.

Events/UI

On Button Clicked

eventclientevent.uiButtonClicked

Fires on the player who clicks a button in one of your menus. Runs on the player's client. Requires players to have the mod (server+client project).

Outputs
(exec)exec
Playerplayer
Settings
Menu LayoutlayoutPickerrequired
ButtonwidgetPickerrequired

The workhorse of a NodeZ menu. Draw a layout, put a named button in it, attach the layout to the project, and this node fires on the player who clicks that button. Everything around it is generated: a real DayZ scripted menu holding your layout, a mouse cursor while it is open, ESC to close, and the wiring that turns a click on that one widget into this event. The graph only has to say what the button *does*.

It runs on the player's own machine, because that is where the menu is. Anything the button then does to the world — handing over an item, teleporting, writing a score — cannot happen there, so NodeZ splits the chain: the client part runs, then it sends the server a message and the rest runs there with the clicking player attached, carrying any widget values the client read. You wire none of that; you only have to keep the halves in the right order.

When to use it

Any menu that *does* something: a spawn selector, a shop, an admin panel. For a key that only flips a HUD panel on and off, use On Key Pressed — a menu takes the controls away from the player while it is open, which is fine for a shop and wrong for a scoreboard. Text boxes and checkboxes have their own events (On Text Box Changed, On Checkbox Changed) but you rarely need them: one click can read every widget in the menu with Get Text Box Text, Is Checkbox Checked and Get Slider Value.

Pins

Menu Layout / Button — panel pickers, not wires. The layout must be attached to the project; the Button dropdown then lists the named widgets in it. A widget left unnamed in the layout editor cannot be picked at all.

Player — the person who clicked, on both halves of the split.

Example

A "starter kit" button. The layout holds a button named btn_kit, a label named lbl_status and a checkbox named chk_ammo.

On Button Clicked (that layout, btn_kit) → Set Widget Text (lbl_status, "Kit sent") → Give Weapon (M4A1 with Mag_STANAG_30Rnd). The first node touches the menu and runs on the player's machine; Give Weapon is server work, so everything from there down is handed to the server automatically.

To make the magazine optional, wire Is Checkbox Checked (chk_ammo) into a Branch after the label update — the client reads the tick and the answer rides across with the hand-off. Put a client-only node such as Close Menu *after* Give Weapon and the editor stops you: by then the chain is on the server, where there is no menu to close.

Watch out

  • Client-side, so players need the mod. Set the project to Server + Client; a server-only install never builds the menu and the button can never be clicked.
  • Client nodes before server nodes, always. Set Widget Text and Close Menu only work while the chain is still on the player's machine, and the editor errors if one lands after a server action.
  • Widget names are exact and come from the layout editor. Rename one there and every node pointing at it fails validation until you re-pick it.
  • A menu with no way to open it never fires. Set the layout's open mode in the layout panel — a keybind, or a hold-interaction on a world object. Only one menu shows at a time, so an open is ignored while another is on screen.
  • Treat what reaches the server as a request, not a fact: cooldowns, permissions and costs belong after the hand-off, not in a branch before it. One click can carry at most ten values across, and the generator refuses to build past that.

On Checkbox Changed

eventclientevent.uiCheckboxChanged

Fires when the player ticks or unticks a checkbox; gives its new state. Runs on the player's client.

Outputs
(exec)exec
Playerplayer
Checkedbool
Settings
Menu LayoutlayoutPickerrequired
CheckboxwidgetPickerrequired

Fires on the player's own machine when they tick or untick a checkbox in one of your menus, and tells you which way it went. Like the other menu events it runs client-side, because that is where the menu is.

When to use it

Immediate reaction to a tick: changing a label, showing what the option will cost, updating a preview. When the tick is simply an *option* that a button will act on later — "include a magazine", "spawn with a backpack" — do not use this event. Leave the box alone and read it at the moment the button is clicked, with Is Checkbox Checked under On Button Clicked. The player can then change their mind before committing, which is what a checkbox is for.

Pins

Checked — the box's new state: true when it is now ticked.

Menu Layout / Checkbox — panel pickers. The layout must be attached to the project, and the Checkbox dropdown lists the named widgets in it.

Example

A mode switch that explains itself. The layout holds a checkbox named chk_hardcore and a label named lbl_mode. On Checkbox Changed (chk_hardcore) → Branch with the event's Checked wired into the condition. The True path runs Set Widget Text (lbl_mode, "Hardcore: you drop everything on death"); the False path runs the same node with "Normal: you keep your gear". Both arms stay on the player's machine, so the label updates the instant the box is clicked.

To remember the choice server-side, continue past the branch: put Set Saved Player Number in each arm writing 1 and 0. Those are server nodes, so NodeZ hands off automatically once the chain reaches them.

Watch out

  • It fires on every change, including the player un-ticking a box they just ticked. Anything expensive under it happens twice as often as you expect.
  • Client-side, so players need the mod: the project must be Server + Client, and a server-only install never builds the menu.
  • Client-only nodes have to come before server ones. Once a chain reaches a server action it stays on the server, and Set Widget Text placed after that point is an error — so put the label updates first and the saving afterwards, exactly as in the example.
  • Nothing about the tick is remembered. The state you get is the widget's state right then; close the menu and it is gone unless you stored it yourself. Set Player Number keeps it for the session, Set Saved Player Number keeps it across restarts.

On Key Pressed

eventclientevent.keyPressed

Fires on a player's own screen when they press this key in-game. Runs on the client — perfect for toggling HUD overlays (a scoreboard on F5). Server actions placed after it run on the server automatically. Requires players to have the mod. The key you pick is only the DEFAULT: it becomes a real DayZ action every player can rebind under Controls, listed there under Name In Controls. The game suppresses it while they are typing or in a menu. The key still does whatever DayZ already uses it for — a mod cannot take TAB away from the inventory — so prefer one the game leaves alone: F5 to F8 are free in both the normal and the diagnostic build.

Outputs
(exec)exec
Playerplayer
Settings
Name In Controlstext · default "Scoreboard"required
Default Keyselect · KC_F5 | KC_F6 | KC_F7 | KC_F8 | KC_B | KC_N | KC_J | KC_U | KC_Y | KC_O | KC_P | KC_G | KC_H | KC_END | KC_INSERT | KC_HOME | KC_K | KC_L | KC_M | KC_TAB · default "KC_F5"required

Fires on one player's own machine the moment they press your key in-game — no menu, no mouse cursor, no interruption to whatever they were doing. That is the whole reason it exists: opening a menu takes the controls away from the player, while a key press can flip a scoreboard on and off while they keep running.

The key in the panel is only a DEFAULT. NodeZ declares it as a real DayZ action in the mod's own inputs file, so it turns up in the game's Controls menu under whatever you typed in "Name In Controls", grouped under your mod, and every player can move it wherever they like. Nothing compares raw key codes; the generated mod asks DayZ once a frame whether your action fired. That is also why the game's own manners come for free — DayZ keeps these actions quiet while a player is typing in chat or has a menu open.

When to use it

Toggling something on the player's own screen: a scoreboard, a stats panel, a legend. It is the light-touch alternative to a full menu — for buttons, text boxes and checkboxes, attach a layout to the project and use On Button Clicked and its siblings instead. For something the server decides on its own, use Every N Seconds or On Server Started.

Pins

Player — the person who pressed the key. This runs on their machine, so it is always the player at the keyboard.

Example

A scoreboard on F5 that toggles. On Key Pressed (Name In Controls "Scoreboard", Default Key KC_F5) → Flip Flop. The A path runs Show HUD Overlay on your scoreboard layout and then Scale For Screen, so the panel is the right size on a 1440p monitor; the B path runs Destroy HUD Overlay on the same layout. Press once to show, again to hide.

A key that does server work looks the same in the graph but is split behind the scenes: On Key PressedTeleport Player to a fixed position. The press happens on the client, then NodeZ sends the server a message and runs the teleport there with the pressing player attached.

Watch out

  • Client-side, so the mod has to be on players' machines as well as the server. Set the project to Server + Client — a server-only install runs its half happily and the key simply does nothing, with no error anywhere.
  • The key still does whatever DayZ already does with it; a mod cannot take TAB away from the inventory. F5 to F8 are free in both the normal game and the diagnostic build you test with. K, L, INSERT and HOME are free in the retail game but taken in the diagnostic build, so a key that "doesn't work" in testing may be fine for players.
  • Give every On Key Pressed node a *different* Name In Controls. That name becomes the action's internal id, so two nodes sharing a name share one binding and both fire together. Renaming it later changes the id, which puts players who had rebound the key back on the default.
  • Client-only nodes must come BEFORE server ones. As soon as the chain reaches a server action, everything below runs on the server — an Set Text placed after it would be reaching for a screen it can no longer see, and the editor flags that as an error.
  • Only the player crosses the hand-off. Anything else the client half worked out has to be re-derived on the server side.

On Text Box Changed

eventclientevent.uiTextBoxChanged

Fires when the player edits a text box; gives its current text. Runs on the player's client.

Outputs
(exec)exec
Playerplayer
Textstring
Settings
Menu LayoutlayoutPickerrequired
Text BoxwidgetPickerrequired

Fires while the player is editing a text box in one of your menus, and hands you what is in the box at that moment. The engine raises a change event on an edit box as it is being typed into, so read this as "the text is now this" rather than "the player has finished typing" — it can fire on every keystroke.

Like every menu node it runs on the player's own machine, because that is where the menu lives.

When to use it

Live feedback while someone types: echoing a value into a label, warning about a bad character, previewing what will be sent. When you only care about the *final* text — which is the usual case — do not use this event at all. Put a button in the menu and read the box with Get Text Box Text when it is clicked, under On Button Clicked. That fires once, deliberately, instead of once per letter.

Pins

Text — the box's contents at that moment, exactly as typed, spaces and case included. It is the same value Get Text Box Text would give you for that box.

Menu Layout / Text Box — panel pickers. The layout must be attached to the project, and the Text Box dropdown lists the named widgets inside it.

Example

A live preview beside a message box. The layout holds an edit box named msg_box and a text widget named msg_preview. On Text Box Changed (msg_box) → Set Widget Text (msg_preview), with Join Text ("Sending: " plus the event's Text) feeding its Text pin. Every keystroke updates the preview, and nothing leaves the player's machine.

Acting on the message is a separate job: add a Send button and read the same box with Get Text Box Text under On Button Clicked.

Watch out

  • It fires again and again as the player types. Never hang a server action off it — an Give Item To Player, a payment, a Write To Log File — or one twelve-letter message becomes twelve of them. Use a button for anything that commits.
  • Client-side, so players need the mod: the project has to be Server + Client, and a server-only install never builds the menu.
  • Client-only nodes must come before any server node in the chain. Once the chain reaches server work it stays there, and Set Widget Text placed after that point is an error.
  • The text arrives exactly as typed. Comparisons with Text Equals are case-sensitive, and a classname a player typed by hand will not match unless the case is right — "gasmask" is not GasMask.

Events/Vehicles

On Player Entered Vehicle

eventserverevent.playerEnteredVehicle

Fires when a player gets into a vehicle's driver seat. Driver seat only — vanilla has no passenger equivalent to hook.

Outputs
(exec)exec
Playerplayer
Vehicleentity

Fires on the server the moment a player settles into a vehicle's driver seat. It rides the vanilla hook the game itself uses to notice a driver has sat down, so it is exact — not a proximity guess — and it hands you both the person and the vehicle they just got into.

Driver seat only. Vanilla gives modders no equivalent for passengers, so someone climbing into the back does not fire this. If you need to know about everyone aboard, sweep with For Each Player Near and test each with Is Player In Vehicle instead.

When to use it

Anything that should react to somebody taking the wheel: logging who drove what and from where, blocking a vehicle a player has not earned, handing the driver a key item, starting a timer for a delivery run, or arming a safezone rule.

For the engine turning over rather than the seat filling, use On Vehicle Engine Started — a player can sit in a car for a long time without starting it. For getting out, On Player Left Vehicle.

Pins

Player — the driver. Live and in the world, so gear, health and variable nodes all work on them straight away.

Vehicle — what they got into, resolved from the seat they occupy. It can come back empty in the rare case where the engine has not finished attaching them yet, so check with Is Valid before acting on it. Feed it to Get Vehicle Fuel, Refuel Vehicle or Vehicle Engine.

Example

A driving-time tracker, paired with On Player Left Vehicle. On Player Entered VehicleSequence.

Then 0 logs the trip: Get Player Name on the Player and Get Entity Type on the Vehicle → Join TextLog Message. Then 1 starts the clock: Get Server UptimeSet Player Number (the Player, Name "driveStart").

The other half is a second graph: On Player Left VehicleGet Server UptimeSubtract (B = Get Player Number of that player's "driveStart") → Add To Saved Player Number (Name "driveSeconds").

Note where the start time is kept. Stamping it on the player rather than in a global is what lets two people drive at once — a global would be overwritten by whoever sat down last, and both trips would then be measured from the same moment.

Watch out

  • Only the driver's seat fires this. Passengers are invisible to it.
  • The Vehicle pin is a live handle. It does not survive a Delay

stash it with Remember Item before the wait if a later step needs it, and check it with Is Valid when you read it back.

  • This is a server event. HUD nodes cannot run under it — to put something on

the driver's screen you need the client half of your mod and a message sent to them.

  • This tells you a player just sat down, not that they are sitting there now.

For the current state, ask Is Player In Vehicle.

  • Tag Item does not work on vehicles. Tags are stored on inventory

items, and a car is not one, so tagging it does nothing and Get Item Tag on it always reads back empty. To mark one particular vehicle, remember it with Remember Item instead.

On Player Left Vehicle

eventserverevent.playerLeftVehicle

Fires when a player gets out of a vehicle's driver seat.

Outputs
(exec)exec
Playerplayer

Fires on the server when a player gets out of a vehicle's driver seat. It is the exact counterpart to On Player Entered Vehicle and rides the matching vanilla hook, so it is precise about the moment rather than guessing from distance.

There is no Vehicle pin here, and that is not an oversight: by the time this runs the player is no longer attached to anything, so there is nothing to hand you. If your work needs the car, do it in On Player Entered Vehicle instead, or find it again around the player with For Each Object Near.

When to use it

Closing off whatever the entry event opened: stopping a delivery timer, clearing a "currently driving" flag, logging where a trip ended, giving back something you took away at the wheel. Driver seat only — a passenger climbing out does not fire it.

Pins

Player — the person who just got out. Their position is where they left the vehicle, so Get Player Position is a good stand-in for "where the car is" if you need it roughly.

Example

The closing half of a driving-time tracker. In On Player Entered Vehicle you stamp the start time on the player with Set Player Number (Name "driveStart", Value from Get Server Uptime). Here you cash it in:

On Player Left VehicleGet Server UptimeSubtract (B = Get Player Number of that player's "driveStart") → Greater Than (B = 0) → Branch → True path → Add To Saved Player Number (Name "driveSeconds") with the difference as the Amount.

The Greater Than guard covers the case where this event fires without a matching entry — a player who was already seated when the server started has no "driveStart", which reads as 0, and would otherwise be credited with the server's entire uptime.

Watch out

  • No Vehicle pin. Capture anything about the car during

On Player Entered Vehicle and stash it — for numbers, Set Player Number on the driver; for the car itself, Remember Item.

  • Driver seat only. Passengers are invisible to this event, as they are to the

entry one.

  • Do not count on it firing when somebody disconnects while still in the seat.

Anything that must be closed off either way belongs in On Player Disconnecting as well.

  • A server event: HUD nodes cannot run under it.

On Vehicle Engine Started

eventserverevent.vehicleEngineStarted

Fires whenever any vehicle's engine starts.

Outputs
(exec)exec
Vehicleentity

Fires on the server every time any vehicle's engine starts, anywhere on the map. It hangs off the vehicle rather than off a player — the hook is the car's own "my engine just started" — so one copy of this event covers every car on the server at once, whether a player is nearby or not.

That also means there is no Player pin. The event knows which vehicle started; it does not know who turned the key. If you need the driver, pair this with On Player Entered Vehicle (which does give you both) or find the nearest person to the car with Get Nearest Player.

When to use it

Reacting to the engine specifically, rather than to somebody sitting down. A player can sit in a car for ten minutes without starting it, and can start a car they have been in all along — the two events fire at genuinely different moments.

Good fits: a noise or particle effect on ignition, a fuel warning, a log of every engine start, or a rule that certain vehicles cannot run in certain places. For the seat rather than the ignition, use On Player Entered Vehicle. To check whether an engine is running right now, Is Engine Running.

Pins

Vehicle — the car whose engine just started. Feed it to Get Vehicle Fuel, Get Entity Position, Vehicle Engine or Get Entity Type.

Example

A low-fuel warning that reaches whoever is driving. On Vehicle Engine StartedGet Vehicle Fuel on the Vehicle → Less Than (B = 0.15) → Branch → True path → Get Entity Position on the Vehicle → Get Nearest PlayerIs ValidBranch → True path → Send Notification ("Low fuel", "Under 15% left in the tank", 8 seconds).

Fuel is reported as 0 to 1 here, so 0.15 is fifteen percent — not the 0-100 scale Spawn Vehicle uses. The nearest-player step is standing in for a driver pin the event does not have; it is a good guess for someone sitting in the car, and the Is Valid check covers an engine that started with nobody around.

Watch out

  • Every vehicle on the server shares this one event. On a busy map that is a

lot of firings — keep the work under it small, and filter early with Get Entity Type if you only care about one model.

  • No Player pin exists, and the nearest player is a guess, not a fact.

On Player Entered Vehicle is the only event that reliably ties a person to a vehicle.

into the other makes them feed each other — put a Branch on something that will be false the second time round, or do not do it.

  • A server event, so no HUD nodes under it. Anything that has to appear on the

driver's screen goes through a notification or a message to their client.

Events/World

On Server Started

eventserverevent.missionStart

Fires once when the server mission starts up. Good for one-time setup.

Outputs
(exec)exec

Fires once, on the server, the moment the mission finishes loading — before anybody has connected. It rides vanilla's own mission-start hook, the same point where the game brings the world up.

A useful thing to know is what has already happened by the time your chain runs. The mod's config.json has been read (and created from your defaults if it was not there), so every config node gives real values. The zones behind your zone events exist. The timers behind Every N Seconds and After Delay On Start are running. Your chain is the last thing to happen at boot, which makes it the right place to put the world into a known state before players arrive.

When to use it

One-time setup that is about the server rather than about a person: seeding globals so their first read is not 0, setting the weather (Set Weather) or clock (Set Time Of Day), building props with Spawn Static Object, writing a "we are up" line with Log Message.

For work that should happen a while after boot, After Delay On Start says so more clearly than this node plus a Delay. For work that repeats, Every N Seconds; for something on the in-game clock, Daily At Time. For setup that belongs to a player, On Player Ready is the one that fires when a character is actually there.

Example

Getting a scoreboard ready and keeping a restart count: On Server StartedLog Message ("arena mod loaded") → Set Global Number ("kills", 0) → Add To Saved Number ("restarts", 1) → Set Time Of Day to a fixed hour so every session starts in daylight.

Note the two different memories in that chain. The global starts at 0 because globals are wiped by the restart that just happened, which is exactly why seeding them here is worth doing. The saved number was loaded back off disk before the chain ran, so adding 1 continues a count that started weeks ago.

Watch out

  • Nobody is online. For Each Player visits nothing, and anything player-shaped has no one to talk to — put that work under On Player Ready instead.
  • HUD nodes cannot run here. They run on a player's machine, and at mission start there is no player and no screen. The same goes for anything else that needs the client half.
  • It runs on every restart, including crashes and scheduled ones. A counter you increment here counts restarts, not days, and anything you spawn here is spawned again each boot.
  • Globals (Set Global Number) are empty at this point by definition — they live only until the next restart. Saved numbers (Get Saved Number) are already loaded and keep their values across restarts; per-player values are neither, since no player exists yet.

Events/Zones

Player Entered Zone

eventserverevent.zoneEntered

Fires when a player walks into a circular area on the map. Set the center position and radius in the panel on the right. Height (Y) of 0 snaps to the ground.

Inputs
Center Positionvector
Radius (m)float
Outputs
(exec)exec
Playerplayer

An invisible circle you place on the map. When the server mission starts, NodeZ spawns a trigger there — the same trigger tech vanilla uses for its contaminated areas — and this node fires the moment a player steps inside. Only players trip it; infected and animals walk through unnoticed.

Everything runs on the server, so a mod built from this works without players installing anything.

When to use it

One-shot reactions at the boundary: a welcome message at a trader, a warning at a minefield, logging who reaches a landmark. For something that keeps happening while players stand inside, use While Player In Zone. To react when they walk out again, use Player Left Zone. If you just want to know how many players are near a point right now, without a standing zone, reach for Count Players Near instead.

Pins

Center Position — map coordinates of the middle. A height (the middle number) of 0 snaps the zone to the ground at that spot.

Radius (m) — how far the zone reaches from the center, in meters.

Both are read once, when the zone is created at mission start. Type fixed values, or wire them from config values (Get Config Position, Get Config Number) so server owners can tune them without opening the editor.

Example

A zone at 7500 0 7500 with radius 30 — Player Entered ZoneSend Notification (title "Toxic Zone", detail "You entered a toxic area!"), with the event's Player wired into the notification's Player pin so only the person entering sees it. Leave that Player pin unwired and the message goes to everyone on the server instead.

That wiring is the Toxic zone template (File → New from template) if you would rather start from it than build it.

Watch out

  • Center and radius are fixed at mission start. Anything computed at runtime (a player's position, a random point) is rejected by the generator with a clear message — use fixed or config values.
  • The zone is a sphere, not a column: it reaches as far up and down as it does sideways. A radius-10 zone at street level does not cover the fourth floor — grow the radius or raise the center.
  • Pairing with Player Left Zone only works if both use exactly the same center and radius; otherwise players can be "inside" one zone and not the other.

Player Left Zone

eventserverevent.zoneLeft

Fires when a player walks out of a circular area on the map. Also fires if a player dies inside the area.

Inputs
Center Positionvector
Radius (m)float
Outputs
(exec)exec
Playerplayer

The other half of a zone. NodeZ spawns an invisible sphere trigger at the position you give — the same trigger tech vanilla uses for its contaminated areas — and this node fires the moment a player crosses back out of it. Only players trip it; infected and animals pass through unnoticed. Everything runs on the server, so a mod built from this works whether or not players have it installed.

It also fires when a player *dies* inside. The trigger keeps a list of who is inside and drops anyone no longer alive, and being dropped counts as leaving. That is usually welcome — a safe-zone flag gets cleared even when the player never walks out — but the leave path can run for a corpse.

When to use it

Undoing whatever entry did: clearing a flag, taking back protection, stopping a timer, logging an exit. It is the natural partner of Player Entered Zone, and the two only behave as a pair when both nodes use exactly the same center and radius. For work that repeats while a player stands inside, use While Player In Zone.

Pins

Center Position — map coordinates of the middle. A height (the middle number) of 0 snaps the zone to the ground there.

Position and radius are read once, when the zone is created at mission start. Type them in, or wire them from Get Config Position and Get Config Number so an owner can move the zone without opening the editor.

Example

A safe zone that turns off again. One Player Entered Zone node at 4600 0 10300 with radius 100 → Set Player Invulnerable (ticked) → Send Notification "Safe zone — weapons are useless here". A second node, Player Left Zone, with the identical center and radius → Set Player Invulnerable (unticked) → Send Notification "You are no longer protected".

Invulnerability does not wear off on its own, so without the leave half your players walk away immortal.

Watch out

  • Death inside the zone fires this too. If the leave path gives something back — unfreezing, restoring gear, paying out — gate it with Is Player Alive so a corpse does not collect.
  • A player who disconnects inside is not guaranteed to fire this. Do session cleanup on On Player Disconnecting as well.
  • The paired enter and leave nodes must match exactly. Different numbers make two differently sized spheres, and a player ends up inside one and outside the other with the flag stuck on.
  • One node is one zone, fixed at mission start. You cannot loop a config list into a single node to get five zones — place five nodes — and a value computed at runtime is rejected by the generator with a clear message.
  • The zone is a sphere, not a column: it reaches as far up and down as it does sideways.
  • Server event: everything under it runs on the server, so client-only HUD nodes cannot go here. Use Send Notification to reach the player's screen.

While Player In Zone

eventserverevent.zoneStay

Runs repeatedly (every N seconds) for each player standing inside a circular area. Good for radiation, healing, or reward zones. Keep the interval at 1 second or more.

Inputs
Center Positionvector
Radius (m)float
Every (seconds)float
Outputs
(exec)exec
Playerplayer

The ticking zone. NodeZ spawns an invisible sphere trigger at mission start — the same trigger tech vanilla uses for its contaminated areas — and while players stand inside it, this node fires again and again on the interval you set. It fires once per player per tick: with four people inside, your chain runs four times, each with a different Player. When nobody is inside, nothing runs at all.

Only players are counted, and anyone who dies inside is dropped from the zone, so a corpse stops ticking on its own. Everything runs on the server, so a mod built from this needs nothing installed on players' machines.

When to use it

Anything continuous and place-based: radiation damage, a healing spring, income for holding a point, policing a trader. Use Player Entered Zone and Player Left Zone for one-shot work at the boundary. For the same shape without a fixed spot, Every N Seconds with For Each Player Near does the job and lets you work out the position at runtime.

Pins

Center Position — map coordinates of the middle. A height (the middle number) of 0 snaps the zone to the ground there.

Every (seconds) — the gap between ticks, one second at minimum.

Position, radius and interval are all read once, when the zone is created at mission start. Type them in, or wire them from Get Config Position and Get Config Number so an owner can retune the zone without opening the editor.

Example

Holding a point pays: While Player In Zone (Center 4600 0 10300, Radius 50, Every 30 seconds) → Add To Player Number (Name "credits", Amount 5) → Send Notification "+5 credits for holding the point".

The same shape with teeth makes a gas zone: While Player In Zone (Center 7500 0 7500, Radius 80, Every 5 seconds) → Get Attachment In Slot (Slot Name = "Mask") → Get Entity TypeText Equals "GasMask" → Branch → on False, Damage Entity (Entity = the Player, Amount = 8). Reading the worn slot rather than searching the inventory stops a mask in a backpack protecting anyone.

Watch out

  • Cost multiplies by the number of people inside. A one-second interval on a busy zone runs your whole chain dozens of times a second; a few seconds is nearly always enough.
  • The interval is approximate — the trigger adds up frame time and fires on the first frame past the gap. Treat it as "about every N seconds", never as a clock.
  • A Delay under this carries only the Player, and each tick starts its own wait. Stamp anything else onto the player with Set Player Number before the wait and read it back after.
  • One node is one zone, fixed at mission start. You cannot loop a config list into a single node to get five zones — place five nodes — and a value computed at runtime is rejected by the generator with a clear message.
  • The zone is a sphere, not a column: a radius-10 zone at street level does not cover the fourth floor.
  • Server event: everything under it runs on the server, so client-only HUD nodes cannot go here. Use Send Notification to reach the player's screen.

Flow

Flow

Branch

flowbothflow.branch

Runs the True path when the condition is true, otherwise the False path.

Inputs
(exec)exec
Conditionbool
Outputs
Trueexec
Falseexec

The yes/no decision of every graph. Wire a true/false value into Condition and the chain continues down exactly one of the two paths — True when the condition holds, False otherwise. The condition usually comes from a compare node (Equals (Numbers), Greater Than, Text Equals, Is Valid); with nothing wired, the checkbox on the node is the fixed answer.

When to use it

Any single decision: is the killer real, is the player alive, does the config toggle say on. To pick between several named text values, Switch On Text is one node instead of a ladder of Branches. To run steps in order rather than choose between them, that is Sequence, not Branch.

Pins

Condition — evaluated once when the Branch runs. Leave a path unwired when nothing should happen on that side.

Example

On Player DiedIs Valid (Killer) → Branch — True gives the killer a Rag with Give Item To Player and a "Kill Reward" notification; False does nothing, because a fall or bleed-out has no killer. That empty Killer is the whole reason for the Branch — without it you would be rewarding nobody on every death the server did not attribute to a player.

That wiring is the Kill reward template (File → New from template) if you would rather start from it than build it.

Watch out

Do not wire the True and False arms back together into one shared node. Two exec wires converging make the build copy everything downstream under both arms — the mod still works, but it doubles silently. When both sides must end in the same follow-up, put the Branch under Then 0 of a Sequence and the shared follow-up under Then 1.

Cast To Player

flowbothflow.castToPlayer

Checks whether an object or entity is a player. Takes the Is Player path (with the Player available) when it is, otherwise the Not Player path.

Inputs
(exec)exec
Objectobject
Outputs
Is Playerexec
Playerplayer
Not Playerexec

Asks "is this thing a player?", and if it is, hands you the player. The chain takes the Is Player path with the Player pin filled in, or the Not Player path when the object turns out to be a tree, a crate, an infected, or nothing at all.

NodeZ lets values flow *up* the ladder on their own — a player is also an entity, an entity is also an object — but never back down. So a pin that only knows it holds "an object" cannot be plugged into anything player-specific, no matter how sure you are. This node is the sanctioned way down, and the check and the conversion are the same step.

When to use it

Any time you hold something that might be a player: an object out of For Each Object Near, the thing that dealt damage, whatever a graph handed you as a general entity. To go down to an item instead of a player, As Item does the equivalent job as a plain value node with no exec wire. To ask only whether a pin is empty, Is Valid is enough.

Pins

Object — anything: an object, an entity, an item, a player.

Player — only in scope under the Is Player path. Wiring it into a node hanging off Not Player is not possible.

Example

An area effect that only touches people: Every N Seconds (10) → For Each Object Near (Position 7500 0 7500, Radius 25) → Body → Cast To Player with the loop's Object → Is Player → Is Player AliveBranch → True → Send Notification ("Contaminated", "The air here is burning your lungs.") → Add Shock (10). Not Player is left unwired, so trees and crates in the sweep are ignored.

Watch out

  • A corpse still casts to a player successfully — it is the same kind of thing, just dead. If a dead body must not count, follow the cast with Is Player Alive and a Branch.
  • Not Player also covers "nothing here". An empty pin and a rock take the same path, so do not read it as proof the object exists.
  • Do not converge Is Player and Not Player into one shared node. Two exec paths meeting make the build copy everything downstream under both; put the cast under Then 0 of a Sequence and shared work under Then 1.
  • If a player-only node refuses your wire, this is almost always the missing piece — not a bug in the pin.

Counter

flowbothflow.counter

Counts how many times it runs. Takes the Each path every pass, and the Reached path once — when the count equals the target. The count keeps rising for the whole server session (it resets on restart). Reached fires exactly on the pass that reaches the target.

Inputs
(exec)exec
Targetint
Outputs
Eachexec
Countint
Reachedexec

A tally built into the chain. Every time the node is reached it adds one to its own count and takes the Each path, with the running Count available there. On the single pass where that count lands exactly on Target, it also takes the Reached path.

The count only ever goes up. It is not reset by Reached, there is no reset pin, and pass 11 against a target of 10 does not fire Reached a second time. A server restart is the only thing that puts it back to zero.

When to use it

Milestones: the 50th kill of the restart, the 10th airdrop, an announcement when the server passes some round number of joins. Each is there for the running commentary; Reached is the payoff.

For a number you want to read, change and reset yourself, use the variable nodes instead — Add To Global Number with Get Global Number gives you the same tally with full control, and Add To Saved Number keeps it across restarts. For a per-player count this node is wrong: it is one shared number. Use Add To Saved Player Number and Get Saved Player Number, which also feed For Each Player (Ranked) for a leaderboard.

Pins

Target — read on each pass and compared for equality.

Count — the running total after this pass, so the first pass gives 1. Only in scope under Each.

Example

Marking every fiftieth death on the server: On Player DiedCounter (Target 50) → Each → Log Message with Count, so the server log carries a running tally; Reached → Broadcast Chat Message ("50 deaths since the restart. Be careful out there.").

Watch out

  • One count, shared by everyone. Under a player event it counts how many times *anyone* triggered it, not how many times each person did.
  • Reached is an exact equality test, not "at least". The count steps by one so it normally lands on the target — but a Target wired from something that changes between passes can be stepped straight over, and Reached then never fires at all. Type a fixed target unless you have a reason not to.
  • The count keeps rising past the target. If you want the milestone to repeat every 50, use Remainder (Modulo) on a number you keep with Add To Global Number instead.
  • Each and Reached must not converge on the same follow-up node — two exec wires meeting duplicate everything downstream. Use Sequence to share a tail.
  • Each Counter node keeps its own separate total, and a restart clears it.
  • Under a client-side event such as On Key Pressed, the total lives on that player's machine, so it counts their presses alone and resets when they quit the game.

Delay

flowserverflow.delay

Waits a number of seconds, then runs the Then path. The Then path runs later, on its own. Only the Player you wire into Carry Player is available in it — values from before the Delay are not (wire the player through this node to keep using it).

Inputs
(exec)exec
Secondsfloat
Carry Playerplayeroptional
Outputs
Thenexec
Playerplayer

A pause in the middle of a chain. Wire a number of seconds, and everything under Then runs that much later. Nothing freezes meanwhile — the node hands the Then path to the server's own timer queue and returns immediately, so the event that started the chain finishes at once and the server carries on serving everybody else.

That is why Delay is unlike every other node: its Then path is built as a separate routine, and exactly one value crosses the gap. Whatever you wire into Carry Player arrives on the far side as the Player output. Everything else from before the wait — an item you just spawned, a name you just read, a loop's current player — is out of scope over there. Wire one across and the build stops with an error naming the Delay, rather than shipping a mod that quietly misbehaves.

When to use it

Whenever the game needs a beat: letting a freshly teleported player finish loading before you hand them gear, spacing out a countdown, letting a client receive an item before the quick bar is told to point at it. For something that repeats on a schedule instead of once, use Every N Seconds. For a single wait measured from server start, After Delay On Start is a whole event and needs no chain to sit under.

Pins

Seconds — decimals are fine (0.5 works). Read once, at the moment the Delay runs.

Carry Player — the one value that survives the wait.

Player — the same player, on the far side. Use this output downstream, never the original event's Player pin: that one is not in scope inside Then.

Example

Gear after a teleport, which is the wiring this node exists for: On Player ReadyTeleport Player (7500 0 7500) → Delay (Seconds 2, Carry Player wired from the event's Player) → Give Weapon (M4A1 with Mag_STANAG_30Rnd), fed by the Delay's Player output → Resync Player Gear. Handing the rifle over in the same instant as the teleport leaves the player looking empty-handed to everyone else, because the engine is still rebuilding them for the other clients. Two seconds is enough.

Watch out

  • Leave Carry Player unwired and the Then path never runs at all. The generated wait is guarded: if the carried player is empty when the timer fires, it stops there. That guard is what saves you when a player disconnects or dies mid-wait, but it also means an unwired Carry Player silently disables everything downstream, with no warning in the editor. Always wire it.
  • Only the player crosses. Anything else the Then path needs must be worked out again after the wait, or stamped onto the player beforehand with Set Player Number / Set Player Text and read back with Get Player Number / Get Player Text.
  • Do not park it in a global instead. Set Global Number is shared by everyone, and another player's event can overwrite it while you are waiting — that is exactly how a loadout ends up on the wrong person.
  • A Delay under Then 0 of a Sequence does not hold up Then 1. Then 1 runs immediately, long before the delayed work. Chain anything that must follow the wait onto the Delay's own Then.
  • A Delay inside a loop body does not stagger the loop. Every pass schedules its own wait in the same instant, so they all fire together — see Repeat for the trick of feeding the loop Index into Seconds.
  • Delay is server-side. HUD nodes cannot live in its Then path, and putting one under a button press makes the whole chain hop to the server first.
  • Inside a custom node, a Delay cannot sit between the entry and Node Outputs: the outputs belong to the caller, which has long since moved on. The build rejects that too.

Do Once

flowbothflow.doOnce

Runs the Once path the very first time it is reached, then never again. The latch lasts for the whole server session — it resets only when the server restarts.

Inputs
(exec)exec
Outputs
Onceexec

A one-shot gate. The first time the chain reaches it, the Once path runs; every time after that, the chain simply stops here. There is no reset pin — the latch it keeps holds for as long as the server is up, and only a restart re-arms it.

When to use it

Something that must happen the first time a *condition* is met, rather than at a fixed moment. First player to walk into the bunker, first kill of the restart, first time the weather turns. For work that belongs at startup with no condition at all, On Server Started already fires exactly once and needs no gate.

For "once per player" this is the wrong node — the latch is one shared flag, not one per person. Stamp the player instead with Set Saved Player Number, read it back with Get Saved Player Number and gate on it with a Branch; that also survives restarts. To alternate rather than stop, use Flip Flop; to fire on the Nth time rather than the first, Counter.

Example

Announcing the first arrival at a landmark: Player Entered Zone (7500 0 7500, radius 30) → Do OnceGet Player Name (the event's Player) → Join Text with " reached the bunker first." → Broadcast Chat Message. Everyone who follows trips the zone as usual and the chain quietly ends at the gate.

Watch out

  • The latch is global, not per player. The first person through closes it for everybody.
  • Each Do Once node keeps its own separate latch. Copying the node gives you a second, independent gate — handy when you want it, surprising when you do not.
  • A restart re-arms it. Anything that must stay done across restarts needs a saved value (Set Saved Number) checked with a Branch instead.
  • Under a client-side event such as On Key Pressed or On Button Clicked, the latch lives on that player's own machine — so it becomes once per player, cleared when they quit the game, rather than once for the server.

Flip Flop

flowbothflow.flipFlop

Alternates between the A and B paths — A on the first pass, B on the next, and so on. The A/B state lasts for the whole server session and resets when the server restarts.

Inputs
(exec)exec
Outputs
Aexec
Bexec

A toggle in the chain. The first time it runs, the A path takes over; the next time, B; then A again, back and forth forever. It keeps one flag to remember which turn it is, and that flag lasts as long as the server is up — a restart puts it back to A.

When to use it

Alternating between two outcomes without any bookkeeping of your own: two airdrop sites taking turns, two announcements rotating, halving the work on a busy timer by doing one job on odd ticks and another on even ones.

For every third or every tenth, this is not enough — use Counter, or Remainder (Modulo) on a number you keep yourself. For a one-way gate that fires once and never again, Do Once. To pick between two paths on an actual condition rather than a turn, Branch.

Example

An airdrop that alternates between two ends of the map: Every N Seconds (1800) → Flip Flop → A → Spawn Item (AmmoBox_556x45_20Rnd) at 3200 0 8600 followed by Broadcast Chat Message ("Airdrop inbound: north-west."); B → its own Spawn Item at 11400 0 4200 and its own broadcast for the south-east. Each arm gets its own nodes.

Watch out

  • Give each arm its own downstream nodes. Wiring A and B into one shared follow-up makes the build copy everything after it under both paths, so the shared tail is generated twice. If both arms genuinely must end in the same step, put the Flip Flop under Then 0 of a Sequence and the shared step under Then 1.
  • The state is one flag for the whole server, not one per player. Under a player event, two players in quick succession get A and then B — they are sharing the toggle, not each getting their own.
  • Every Flip Flop node has its own flag. Two copies do not stay in step with each other.
  • A restart always starts again on A, so a schedule that matters across restarts needs a saved number (Set Saved Number) rather than this.

For Each Config Number

flowserverflow.forEachConfigNumber

Runs the Body path once for every number in a config list.

Inputs
(exec)exec
Outputs
Bodyexec
Numberfloat
Completedexec
Settings
Config FieldconfigFieldPickerrequired

Walks a list of numbers from the mod's config file. Pick the list with the Config Field picker and the Body runs once per entry, handing you that number, then Completed runs. Like the other config lists, it lives in $profile:<ModName>/config.json and the server owner can lengthen or shorten it without touching the graph.

When to use it

Lists of amounts, radii, delays or tiers that a server owner should be able to tune. For one fixed number, Get Config Number needs no loop; for a random pick, wire Random Number into Get Config Number At; to count entries, Config List Count.

Pins

Number — the current entry, as a decimal.

Example

Hordes of configurable size at configurable places: On Server StartedFor Each Config Number (Config Field: your number list, say hordeSizes) → Body → To Whole Number on Number → Repeat with that as Times → Spawn Infected or Animal (ZmbM_HunterOld_Autumn) at a position from Random Config Position.

Watch out

  • The Number pin is a decimal. Whole-number pins — a Repeat's Times, a quick bar slot, an index — will not take it directly; put To Whole Number in between.
  • There is no Index, so this list cannot be lined up with a second one. For parallel lists use Repeat driven by Config List Count, reading each list at the loop Index with Get Config Number At and Get Config Text At.
  • The config file is read once and cached, so an owner's edits apply at the next restart.
  • An empty or missing list runs no Body passes and still runs Completed.
  • Do not converge Body and Completed on the same node — that duplicates everything downstream. Use Sequence.

For Each Config Position

flowserverflow.forEachConfigPosition

Runs the Body path once for every position in a config list (e.g. every spawn point).

Inputs
(exec)exec
Outputs
Bodyexec
Positionvector
Completedexec
Settings
Config FieldconfigFieldPickerrequired

Walks a list of map coordinates that the server owner keeps in the mod's config file. You define the list once in the Config panel, pick it here with the Config Field picker, and the Body runs once for every position in it — then Completed runs. Add a coordinate to the file and the loop covers it; delete one and it stops. No graph edit either way.

That is the whole point of the config lists: the person running the server gets to move your spawn points around in $profile:<ModName>/config.json without ever opening the editor.

When to use it

Anything that should happen at several places: crates at every configured drop site, static props at every landmark, a sweep of each arena. To pick one entry at random instead of visiting all of them, Random Config Position. For a single fixed place, Get Config Position needs no loop. To count the entries, Config List Count.

Pins

Position — the current coordinate. Only in scope under Body.

Example

Restocking supply crates everywhere the owner asked for one: On Server StartedFor Each Config Position (Config Field: your positions list, say crateSpots) → Body → Spawn Item (SeaChest) with the loop Position wired into its Position pin → Set Item Lifetime (3600) so the crate sticks around → Completed → Log Message ("Crate restock done.").

Watch out

  • There is no Index on this node, so you cannot line it up with a second list. When entry 3 of the positions has to pair with entry 3 of a classnames list, drive a Repeat from Config List Count instead and read both lists at the loop Index with Get Config Position At and Get Config Text At.
  • The config file is read once, the first time the mod looks at it, and kept in memory from then on. An owner editing config.json on a live server sees nothing change until a restart — say so in your server notes.
  • An empty or missing list is handled quietly: the Body never runs, Completed still does. A loop that "does nothing" is usually an empty list, not a broken wiring.
  • The height in each coordinate is used as written. If the list holds ground-level spots with a 0 height, run the Position through Snap To Ground before spawning, or things end up buried or floating.
  • Do not wire Body and Completed into the same follow-up node; converging exec paths duplicate everything downstream. Use Sequence.

For Each Config Text

flowserverflow.forEachConfigText

Runs the Body path once for every text value in a config list.

Inputs
(exec)exec
Outputs
Bodyexec
Textstring
Completedexec
Settings
Config FieldconfigFieldPickerrequired

Walks a list of text values from the mod's config file — most often a list of classnames. You define the list once in the Config panel, pick it here with the Config Field picker, and the Body runs once per entry, then Completed. The server owner edits the list in $profile:<ModName>/config.json, so a starter kit can grow or shrink without the graph changing at all.

When to use it

Handing out a kit, deleting a banned-item list, spawning one of each of something. To take a single random entry rather than all of them, Random Config Text. For one fixed text value, Get Config Text with no loop. To count entries, Config List Count.

Pins

Text — the current entry. Only in scope under Body.

Example

A starter kit the owner controls: On Player ReadyClear InventoryFor Each Config Text (Config Field: your text list, say starterKit) → Body → Give Item To Player with the loop Text wired into its Classname pin. Add "BandageDressing" to the list in the config file and every new spawn gets one, with no rebuild of the graph.

Watch out

  • Classnames are case-sensitive, and a wrong one fails silently — nothing spawns, nothing complains. "GasMask", not "Gasmask"; "Aug", not "AUG". This is the single most common reason a config-driven kit comes out short.
  • One entry is one string; config lists cannot hold structures. When an entry needs several parts, encode them with a separator ("Aug,Mag_STANAG_30Rnd" or "name=medic; radius=40") and unpack inside the Body with Get Text Part or Get Setting.
  • There is no Index here, so two lists cannot be walked side by side. For parallel lists, drive a Repeat from Config List Count and read each list at the loop Index with Get Config Text At and Get Config Number At.
  • The file is read once and kept in memory, so an owner's edit to config.json takes effect at the next restart, not immediately.
  • An empty or missing list runs no Body passes at all and still runs Completed.
  • Giving gear in the same instant as a teleport desyncs. If this loop follows an Teleport Player, put a Delay of about 2 s in between and finish with Resync Player Gear.
  • Do not converge Body and Completed on one node; that duplicates the tail. Use Sequence.

For Each Item In Inventory

flowserverflow.forEachItemInInventory

Runs the Body path once for every item in an entity's inventory - worn gear, hands, cargo, and everything nested inside bags. Works on players, containers, vehicles... The container itself is not included.

Inputs
(exec)exec
Containerentity
Outputs
Bodyexec
Itementity
Completedexec

A full walk of everything a thing is carrying. Give it a container and the Body runs once per item inside: worn clothing, what is in the hands, everything in cargo, and everything nested inside those — the magazines in the vest, the food in the backpack, the backpack itself. It is the same deep enumeration the game uses internally, so nothing hides one level down.

The container you pass in is not included in its own list. It works on anything with an inventory: a player, a tent, a crate, a vehicle.

When to use it

When you need to look at, or act on, everything someone has: auditing gear, stripping a player before a match, counting what is in a stash, taxing a trader crate. If you already know the classname you are after, the direct nodes are far simpler — Has Item In Inventory, Count Items In Inventory, Find Item In Inventory, and Remove Items Of Type to delete them. To wipe a player completely, Clear Inventory is one node. To read only what is worn in a named slot, use Get Attachment In Slot.

Pins

Container — a player, or any entity with an inventory.

Item — the current item. It arrives as a general entity, which reaches entity pins like Delete Entity and Get Display Name directly, but item-specific nodes (Set Item Quantity, Set Item Health, Get Item Quantity) need it passed through As Item first.

Example

Logging what a player is carrying when they die: On Player DiedFor Each Item In Inventory with the event's Player wired into Container → Body → Get Display Name (loop Item) → Join Text with "Dropped: " → Write To Log File.

To act instead of watch, swap the tail: Body → Get Entity Type (Item) → Text Equals ("GasMask") → Branch → True → Delete Entity removes every gasmask anywhere on them, pockets and backpacks included.

Watch out

  • Worn is not the same as carried, and this loop sees both. A gasmask sitting in a backpack turns up here exactly like one on the face — it protects nobody. When the distinction matters, read the slot with Get Attachment In Slot instead.
  • Deleting items while walking the list is fine — the list is taken before the loop starts — but anything you *add* during the loop will not appear in it.
  • The Item pin is an entity, not a classname. Compare with Get Entity Type, and remember classnames are case-sensitive: "GasMask", not "Gasmask".
  • A large stash means a long loop in a single frame. Running this on every player on a short timer adds up quickly.
  • An empty or missing container is handled quietly: the Body never runs and Completed still does.
  • Do not wire Body and Completed into the same node; converging exec paths duplicate the tail. Use Sequence.

For Each Object Near

flowserverflow.forEachObjectNear

Runs the Body path once for every object within a radius of a position.

Inputs
(exec)exec
Positionvector
Radius (m)float
Outputs
Bodyexec
Objectobject
Completedexec

Everything the engine knows about within a radius of a point — and it means everything. Dropped loot, spawned crates, infected, animals, players, and every tree, rock, fence and building the map is made of. The Body runs once per object with that object available, then Completed runs.

Because the list is that wide, the Object pin gives you the vaguest type NodeZ has. It will not connect to pins that expect an item or a player: you have to narrow it first, and narrowing is also the test for what the thing is.

When to use it

Sweeping an area: clearing loose gear from an arena floor, finding out what is sitting on a spawn pad, hurting everything inside a blast. To clear ordinary ground loot and nothing else, Delete Items In Radius does the whole job in one node with no loop and no narrowing. If you only care about players, For Each Player Near hands them to you already typed. To walk what is inside a container rather than around it, use For Each Item In Inventory.

Pins

Object — narrow it before use: As Item turns it into an item (empty when it is not one, so test with Is Valid), Cast To Player routes players onto their own path, and Get Entity Type gives the classname for a text compare.

Radius (m) — keep it modest, and read it as a flat distance across the ground rather than a bubble. The engine hands back map geometry along with the loot, so a large radius in a town is a lot of objects.

Example

Clearing an arena of the gear your own mod put there, and nothing else: Every N Seconds (300) → For Each Object Near (Position 7500 0 7500, Radius 60) → Body → As Item on Object → Get Item TagText Equals ("arena") → Branch → True → Delete Entity fed by the As Item output.

The tag is what makes this safe. It is written by Tag Item when the item is spawned, and it is the only way to tell your Aug from an Aug a player carried in — the engine keeps no record of who created what.

Watch out

  • Never wire the raw Object straight into Delete Entity. The list includes the buildings and trees the map is made of, and a blind sweep aims at those too. Narrow first, then act.
  • As Item comes back empty for anything that is not an item, so check it with Is Valid (or compare its tag, as above) before you use it.
  • Ownership cannot be read from engine state. Tag your spawns with Tag Item and check with Get Item Tag; there is no other way to tell them apart.
  • Height is ignored completely. The engine tests a circle on the ground, not a ball, so the sweep is really a column with no top and no bottom: it catches the crate on a roof overhead and the loot in the basement, however far up or down they sit. If a floor matters, measure it yourself — As ItemGet Entity PositionSplit Position and compare the Y (height) output with Less Than.
  • The whole sweep happens in one frame. A big radius on a short timer is one of the easier ways to make a server stutter.
  • Do not converge Body and Completed into a single node — that duplicates the tail under both. Use Sequence.

For Each Player

flowserverflow.forEachPlayer

Runs the Body path once for every player on the server. Index counts from 0 in the order players are listed.

Inputs
(exec)exec
Outputs
Bodyexec
Playerplayer
Indexint
Completedexec

Walks everybody on the server. The Body path runs once per player with that player and their Index available, and when the last one is done the Completed path runs once. It asks the engine for the same player list the server keeps for its own housekeeping, so it sees everyone connected right now — no zone, no radius, no filter.

Index counts the players actually handed to the Body, starting at 0, so it is always a gapless 0, 1, 2 you can use as a row number.

When to use it

Server-wide sweeps where each player needs something of their own: a scheduled heal, a per-person message with their own score in it, a restart warning that names the player. If every player just needs to see the same words, skip the loop — Broadcast Notification and Broadcast Chat Message reach everyone in one node. For a subset around a point use For Each Player Near, and for a leaderboard order use For Each Player (Ranked).

Pins

Body — runs once per player. Player and Index are only in scope under this path.

Completed — runs once, after the last Body, in the same instant. Good for a summary line.

Example

An hourly medical drop: Every N Seconds (3600) → For Each Player → Body → Is Player Alive (loop Player) → Branch → True → Heal Player Fully (loop Player) → Send Notification ("Medical Drop", "You have been patched up."). Completed → Broadcast Chat Message ("Medical drop complete.").

The aliveness check is not optional politeness — without it the loop happily "heals" corpses.

Watch out

  • Bodies still count. A dead player stays in the list until their corpse despawns, so anything that must not happen to a corpse needs a Is Player Alive gate in the Body.
  • Do not wire Body and Completed into the same follow-up node. Two exec wires converging make the build copy everything downstream under both, so your summary line runs once per player as well. Put the shared work under Sequence instead.
  • A Delay in the Body does not pause the loop. All the waits are scheduled in the same instant and go off together — each one does carry its own player, which is usually what you want.
  • The whole loop runs in a single frame. Heavy work per player (spawning, big searches) multiplied by a full server is a visible hitch; keep the Body light or run it less often.

For Each Player (Ranked)

flowserverflow.forEachPlayerRanked

Runs the Body path once for every player, in the order of a number stored on them — the highest first, for a leaderboard. Rank counts from 1, so it can address row 1, row 2 and so on directly. Value is that player's number. Players tied on the same number keep the order the server lists them in.

Inputs
(exec)exec
Outputs
Bodyexec
Playerplayer
Rankint
Valuefloat
Completedexec
Settings
Number Nametext · default "score"required
Stored Asselect · Saved Player Number | Player Number · default "Saved Player Number"required
Orderselect · Highest first | Lowest first · default "Highest first"required

A leaderboard in one node. It reads a named number off every player on the server, sorts them, and runs the Body once per player in that order — best first by default — handing you the player, their Rank and their Value. Rank counts from 1, so it addresses "row 1, row 2" directly without any arithmetic.

The number is one you have been keeping yourself. Number Name is the name you used when you stored it, and Stored As says where to look: *Saved Player Number* reads the on-disk store written by Set Saved Player Number and Add To Saved Player Number, which is keyed to the player's Steam ID and survives restarts; *Player Number* reads the in-memory value from Set Player Number and Add To Player Number, which lasts only for their session. Pick the one that matches the node you wrote the score with, or every row reads zero.

When to use it

Any ordered pass over players: a scoreboard, a top-three announcement, paying out prizes at the end of a round. When order does not matter, For Each Player is cheaper and gives you a plain Index. To read one player's number without looping, use Get Saved Player Number or Get Player Number.

Pins

Rank — 1 for the leader, 2 for second, and so on.

Value — that player's number, already read. There is no need to look it up again inside the Body.

Completed — runs once after the last row.

Example

A scoreboard broadcast every few seconds: Every N Seconds (5) → For Each Player (Ranked) with Number Name "kills", Stored As *Saved Player Number*, Order *Highest first* → Body → Join Text joining Rank and Get Player Name (loop Player), then a second Join Text adding the Value → Broadcast Chat Message with that text.

To limit it to the top three, put a Less Than on Rank (B = 4) into a Branch and hang the message off True.

Watch out

  • Everyone connected is in the list, including players who have never scored — a missing number reads as 0, so the bottom of the board fills with zeroes. Gate on Value with a Greater Than if you only want players who are actually on the board.
  • Corpses are still players and still rank. Add a Is Player Alive check in the Body if a dead man should not hold a row.
  • Getting Stored As wrong is the silent failure here. A score written with Add To Saved Player Number but read as *Player Number* gives a board of zeroes, in server list order, with no error anywhere.
  • Players tied on the same number keep the order the server listed them in, so a board refreshing every few seconds does not jitter between two level players.
  • Do not converge Body and Completed into one shared node — that duplicates everything downstream under both. Use Sequence to phase the work instead.
  • Saved numbers follow the person, not the character. A player who dies and respawns keeps their score; that is usually the point, but it does mean a wipe needs you to clear the numbers yourself.

For Each Player Near

flowserverflow.forEachPlayerNear

Runs the Body path once for every player within a radius of a position.

Inputs
(exec)exec
Positionvector
Radius (m)float
Outputs
Bodyexec
Playerplayer
Completedexec

Everyone standing within a given distance of a point. The node measures each player's straight-line distance from the position you give it and runs the Body once for each that falls inside the radius, then runs Completed. Position and radius are both read once, at the start, so the whole sweep uses one consistent circle.

When to use it

Anything that should affect a place rather than the whole server: an announcement at a trader, damage inside a hazard, a reward for whoever is standing on the objective. If you only need the count, Count Players Near answers without a loop; for the single closest person, Get Nearest Player. If the point of interest is a standing area players walk in and out of, the zone events (Player Entered Zone, While Player In Zone, Player Left Zone) fire on their own and need no timer behind them. For everyone on the server, For Each Player.

Pins

Position — the middle of the circle. Type it in, or wire it from Get Config Position so the owner can move it, or from Get Player Position to sweep around somebody.

Radius (m) — meters from that point.

Example

A capture point that pays whoever is standing on it: Every N Seconds (30) → For Each Player Near (Position 7500 0 7500, Radius 25) → Body → Is Player AliveBranch → True → Add To Saved Player Number (Name "points", Amount 1) → Send Notification ("Objective", "+1 point for holding the point.").

Watch out

  • It measures in three dimensions, not on a flat map. A 10 m sweep at street level does not reach the fourth floor of a building above it — widen the radius or raise the position if height should not matter.
  • Corpses are still players. A body lying on the objective collects points forever unless you gate the Body with Is Player Alive.
  • The position is snapshotted before the loop, so wiring a volatile value like Random Point Near into it rolls once and the whole sweep shares that one point — which is what you want here.
  • Nothing announces an empty sweep. If nobody is nearby, the Body never runs and Completed still does; put "nobody was here" handling on Completed with a Count Players Near check rather than expecting the loop to tell you.
  • Do not wire Body and Completed into the same follow-up node; converging exec paths duplicate everything downstream. Use Sequence.

Repeat

flowbothflow.repeat

Runs the Body path a set number of times, counting from 0.

Inputs
(exec)exec
Timesint
Outputs
Bodyexec
Indexint
Completedexec

Do the same thing N times. The Body path runs Times over, with Index counting 0, 1, 2 and so on, and then Completed runs once. Times is read once before the first pass, so nothing that happens inside the loop can change how many passes are left.

Set Times to 0 and the Body simply never runs — Completed still does.

When to use it

Fixed repetition: three crates instead of one, a burst of spawns, ten rows of a table. It is also the way to walk several config lists side by side. The For Each Config nodes give you one value at a time and no position, so when entry 3 of the weapons list has to line up with entry 3 of the magazines list, drive a Repeat from Config List Count and read each list at the loop Index with Get Config Text At, Get Config Number At and Get Config Position At.

For one pass per player, For Each Player; per item, For Each Item In Inventory.

Example

A loot run driven entirely by config: On Server StartedRepeat with Times wired from Config List Count on your positions list → Body → Spawn Item, its Position from Get Config Position At (Index) and its Classname from Get Config Text At (Index) on a parallel classnames list. Entry 3 of one list always lands with entry 3 of the other, because both are read at the same Index.

Watch out

  • Index starts at 0. Anything counted from 1 — a quick bar slot, a scoreboard row — needs an Add of 1 on the way out.
  • Two parallel lists of different lengths will run off the end of the shorter one. The At nodes return a safe empty value rather than erroring, so the symptom is a silent blank entry, not a crash — size the loop from the shorter list.
  • A volatile value like Random Number inside the Body rolls fresh on every pass, which is usually the point. Wiring that same node into two pins in one pass still gives two different numbers — store the roll with Set Global Number and read it back if both need to match.
  • A Delay inside the Body does not space the passes out. Every pass schedules its wait in the same instant and they all fire together. To stagger them, wire Index through Multiply into the Delay's Seconds so pass 0 waits none, pass 1 waits the gap, and so on.
  • Times is a whole number. A decimal source — a config number, a Divide result — has to go through To Whole Number first.
  • A very large Times runs entirely in one frame and will hitch the server.

Sequence

flowbothflow.sequence

Runs each Then path in order, one after another.

Inputs
(exec)exec
Outputs
Then 0exec
Then 1exec
Then 2exec

Runs its three Then paths in order: everything under Then 0 finishes, then Then 1, then Then 2. It is a phasing tool, not a decision — all three always run, in the same instant, one after another. Unwired Then pins are simply skipped.

When to use it

Splitting one event into tidy stages: "first settle the score, then hand out the kit". It is also the cure for a subtle build problem: wiring two exec paths (say, both arms of a Branch) into the same follow-up node makes the generated code duplicate everything downstream under both sources. Instead, put the branching work under Then 0 and the shared follow-up under Then 1 — it runs once, after either arm.

Need more than three phases? Wire another Sequence into Then 2. For choosing one path instead of running all of them, use Branch or Switch On Text.

Example

A spawn handler split into two phases: On Player ConnectedSequence — Then 0 resets the player's round score with Set Player Number (Name "score", Value 0); Then 1 goes into a 2-second Delay and then Give Item To Player (Aug). The bookkeeping lands instantly, because nothing about it needs the player to be finished loading; the kit waits, because handing items to a body the client is still streaming in is how loadouts go missing.

Watch out

A Delay inside Then 0 does not hold up Then 1. The Delay schedules its tail for later and returns immediately, so Then 1 runs right away — long before the delayed work. If step two must wait for step one's delay, chain it after the Delay's Then instead.

Switch On Text

flowbothflow.switchOnText

Runs a different path depending on which text the Value matches.

Inputs
(exec)exec
Valuestring
Outputs
Case 1exec
Case 2exec
Case 3exec
Case 4exec
Defaultexec
Settings
Match 1text
Match 2text
Match 3text
Match 4text

One text in, one of five paths out. You type up to four things to match on the node, and the chain takes the Case that matches — or Default when none do. The comparison is a plain, exact, whole-string match, tried from Match 1 downwards, so the first one that fits wins and the rest are skipped.

Match slots you leave blank are dropped entirely: their Case pin can never fire, no matter what comes in. Fill the matches from the top.

When to use it

Routing on a name: which team a player is on, which classname just changed hands, which mode the config asks for. It replaces a ladder of Branch plus Text Equals with one readable node. For a partial match ("does this classname contain Mag_") use Text Contains into a Branch. For numbers, compare with Equals (Numbers) or Greater Than into a Branch. For a single yes/no, Branch is still the right node.

Pins

Value — read once, when the switch runs.

Default — everything that matched nothing, including empty text. Leave it unwired if unmatched values should do nothing.

Example

Team loadouts from a value stamped on the player: On Player ReadyGet Player Text (Name "team") → Switch On Text with Match 1 "blue" and Match 2 "red" → Case 1 → Give Weapon (AKM with Mag_AKM_30Rnd); Case 2 → Give Weapon (M4A1 with Mag_STANAG_30Rnd); Default → Send Chat Message ("You have not picked a team yet.").

The text itself gets there earlier, from Set Player Text when the player chooses a side.

Watch out

  • Matching is case-sensitive and exact. "Blue" does not match "blue", and "GasMask " with a trailing space matches nothing at all. Classnames especially: "Aug", not "AUG".
  • A blank Match slot silently disables its Case. If Case 3 never seems to fire, check that Match 3 actually has text in it.
  • Two Match slots holding the same text mean the lower one can never win.
  • Do not wire two Cases into one shared follow-up node. Converging exec paths make the build copy everything downstream under both, so shared work happens twice over. Put the switch under Then 0 of a Sequence and the shared work under Then 1.
  • Four matches is the limit. For more, chain a second Switch off the Default path.
  • Comparing a classname read from Get Entity Type is the common use, and its exact casing comes from the game's own config — copy it, do not retype it from memory.

Actions

Actions/Admin

Kick All Players

actionserveraction.kickAllPlayers

Disconnects every player from the server (e.g. before a restart).

Inputs
(exec)exec
Outputs
(exec)exec

Walks the server's player list and disconnects everyone who has a live connection. It is the bulk form of Kick Player, with no pins to fill in — one node, everybody out.

When to use it

Clearing the server at a known moment: the last step of a restart countdown, or emptying the world before maintenance. For a single player, use Kick Player.

Example

The tail of a restart countdown on a four-hour cycle: Every N Seconds (30) → Get Server UptimeGreater Than (14340) → Branch → the True side runs Do OnceBroadcast Notification ("Restart", "Server restarts in one minute", 30 seconds) → Delay (55 seconds) → Kick All Players. Everyone gets a warning, a minute to find somewhere safe, and a clean disconnect just before the restart script takes over.

Watch out

  • This does not stop or restart the server. The moment they are out, players can reconnect to the still-running server — it only makes sense seconds before something else actually takes the server down.
  • It kicks whoever triggered it too, including you while testing.
  • Do Once or a similar gate matters here more than anywhere: a condition that stays true for the rest of the cycle would kick every player again on each check, including everyone who just reconnected.
  • Server node. Under a menu or key event the chain moves to the server from this point, so client-only nodes (Set Widget Text, Close Menu, the HUD nodes) must come before it.

Kick Player

actionserveraction.kickPlayer

Disconnects a player from the server.

Inputs
(exec)exec
Playerplayer
Outputs
(exec)exec

Disconnects one player from the server, the same way the server drops a connection for any other reason. Their character is saved and left in the world as vanilla always handles a disconnect; the person is simply put back at the server browser.

The node checks first. It only acts on a real player with a live connection, so an empty Player pin or someone who has already left is skipped quietly instead of causing trouble.

When to use it

Enforcement you cannot handle in-game: a whitelist, an admin tool, removing someone during maintenance. It is not a punishment with any staying power — for consequences inside the game, Kill Player or Set Player Restrained keep the player on the server. To clear the whole population before a restart, use Kick All Players.

Pins

Player — who to disconnect. Empty is safe: the node does nothing.

Example

A whitelist with a warning: On Player ReadyIs Player In ID List (your Steam IDs, comma-separated) → NotBranch; the True side (they are not on the list) runs Send Notification ("Whitelist", "This server is private — you will be disconnected", 8 seconds) → Delay (5 seconds, carrying the Player) → Kick Player on the delay's Player output. The wait is what turns a baffling disconnect into an explained one.

Watch out

  • A kick is not a ban. The player can reconnect immediately, which is why a whitelist check belongs on On Player Ready — it runs again on every join, so it keeps kicking them until they stop trying.
  • The player sees only a generic disconnection, with no reason attached. Send the explanation first, then wait a few seconds before kicking, as above.
  • Delay carries the player and nothing else, which suits this node perfectly — but any text or number you worked out before the wait is gone, so build the warning message before the delay, not after.
  • Under For Each Player remember that corpses are still in the player list. Gate on Is Player Alive where that matters, and be careful with sweeping conditions — a kick loop with a wrong comparison empties your server in one pass.
  • Test with your own account in mind: a rule wired to "everyone who is not on the list" includes you until your own ID is in it.

Write To Log File

actionserveraction.writeLogFile

Appends a line to a text file in the server profile folder. The file is created in the server profile folder — great for keeping your own audit trail.

Inputs
(exec)exec
Textstring
Outputs
(exec)exec
Settings
File Nametext · default "nodez-log.txt"

Appends a line to a plain text file of your own, in the server's profile folder — the folder your server launches with, next to the .RPT logs. The file is created the first time the node runs and added to from then on, so it survives restarts and builds up into a record you can open, search or load into a spreadsheet.

The File Name setting decides which file the line lands in, so one graph can keep several separate records: joins in one file, admin actions in another. Each node writes the text you give it and nothing else — no timestamp, no player name, no separators are added for you.

When to use it

Audit trails and anything you want to keep: who joined and when, which players were kicked, what a shop sold. For quick "did this run" checks while building a graph, Log Message is easier — it needs no file and is already tagged with your mod name. For anything a player should see, use Send Notification or Send Chat Message.

Pins

Text — the whole line, exactly as it will appear. Build it with Join Text.

File Name (panel) — the file inside the profile folder. Plain names only, and pick a distinctive one so it cannot collide with a server or mod log.

Example

A join log that sorts itself: On Player ConnectedGet Date & Time Text and Get Player Name into Join Text ("2026-07-17 14:05:33 joined: Dave") → Write To Log File (File Name joins.txt). Because the timestamp starts with the year, the lines end up in time order without any work.

A record you can open as a spreadsheet: join the same values with commas — timestamp, Get Player Steam ID, Get Player Name — and write to joins.csv. One Join Text per column pair, and the file imports straight into any spreadsheet.

Watch out

  • Writing is limited to the profile folder. A File Name pointing into a folder that does not exist writes nothing and reports nothing — the node fails silently, so if the file never appears, check the name before you suspect the graph. Prove the chain runs with an Log Message alongside it.
  • The file is opened and closed on every single call. That is fine for events; it is not fine inside a one-second timer or a per-player loop, where it becomes real disk work on every pass.
  • Nothing is added to your text. No timestamp, no newline separators between fields, no mod tag — an unstamped log line is impossible to place later, so put Get Date & Time Text at the front of anything you intend to keep.
  • The file grows forever. Nothing rotates or trims it; on a busy server a per-connect log becomes large, so plan to archive it during restarts.
  • Server node. Under a menu or key event the chain moves to the server from here on, so client-only nodes (Set Widget Text, Close Menu, the HUD nodes) must come first.

Actions/Damage

Create Explosion

actionserveraction.createExplosionDamage

Creates an explosion at a position that damages nearby players and objects.

Inputs
(exec)exec
Positionvector
Sourceentityoptional
Outputs
(exec)exec
Settings
Explosion Typeselect · Explosion_40mm_Ammo | ExplosionSmallGrenade | ExplosionLandmine | ExplosionTestGrenade · default "Explosion_40mm_Ammo"required

Sets off a blast at a point on the map, using the game's own explosion damage system. Everything in range takes the damage that ammunition type deals — players, infected, vehicles, dropped loot — falling off with distance the way that ammunition's blast normally does.

The Explosion Type is not decoration: the blast radius and how hard it hits are read from that ammunition's own config, so choosing the type *is* choosing the size of the explosion. Explosion_40mm_Ammo is a launcher shell, ExplosionSmallGrenade a frag grenade, ExplosionLandmine a mine.

The one thing this node does not do is look or sound like an explosion. It is damage only — no flash, no bang, no smoke. In vanilla those come from the grenade itself, and there is no grenade here. Pair it with Spawn Particle Effect and Play Sound At Position at the same point, or players will simply fall over for no reason.

When to use it

Anything that should hurt an area at once: artillery events, minefields, a self-destructing crate. For damage to one thing, Damage Entity. When some players must be spared, For Each Player Near with Damage Entity in the body lets you check each one first — this node gives you no such chance.

Pins

Position — the centre of the blast. Height counts: a position at sea level (a height of 0) puts the explosion under the terrain and much of the damage with it. Send config or computed positions through Snap To Ground first.

Source — optional, the entity blamed for the blast. Leave it empty and the explosion belongs to nobody, which is usually what you want for a scripted event.

Example

A shelled zone that players can hear coming. Add a Position list strikePoints and a Number field strikeEvery (default 900), then wire Every N Seconds (Every (seconds) from Get Config Number) → Set Global Position ("strike") fed by Random Config PositionBroadcast Notification ("Incoming — take cover") → Delay (5 seconds) → Spawn Particle Effect (Large fire) → Play Sound At Position (Explosion_MortarShell_SoundSet) → Create Explosion (Explosion_40mm_Ammo). All three of those last nodes take their position from Get Global Position ("strike") so the warning, the fireball, the bang and the damage land in the same place.

Storing the point in a global before the delay is what makes the five-second warning work: after a delay, only a carried player survives from before the wait, and here the timer is the only thing that ever writes that global, so nothing can overwrite it mid-countdown.

Watch out

  • Silent and invisible on its own. Without a particle and a sound alongside it, players just die for no apparent reason.
  • It does not care who anybody is: everyone in range is damaged, the player who triggered it included. The damage is dealt by the server, so it lands on players with no mod installed too.
  • Height decides the damage. An explosion under the terrain barely reaches anyone.
  • A random position must be stored before use. Wired straight into several nodes it rolls a fresh point for each, and the smoke, the bang and the blast land in three different places.

Damage Entity

actionserveraction.damageEntity

Deals damage to any object, item, creature, or vehicle.

Inputs
(exec)exec
Entityobject
Amountfloat
Outputs
(exec)exec
Settings
Zone (blank = whole)text

Takes health off anything the engine treats as an object: a player, an infected, a car, a dropped rifle, a tent, a fence. It is the same "decrease health" call the game's own damage system uses when a bullet lands, minus the bullet.

The Amount is health points on that thing's own scale, not a percentage. A player's health runs 0 to 100, so 25 is a quarter of them. An item's maximum health comes from its own config and is usually in the hundreds or thousands, so the same 25 barely scuffs a rifle and does nothing noticeable to a truck. Expect to pick a different number for every kind of target.

When to use it

Wearing something down rather than finishing it: a zone that hurts, a trap, an event that degrades vehicles. To destroy outright use Kill Entity (or Kill Player for a player). To set a condition rather than subtract from it, use Set Player Health for players (0-100%) or Set Item Health for items, which can also take a percentage. To go the other way, Repair Entity.

Pins

Entity — anything: a Player output wires straight in, as does an Item or an Object from a loop like For Each Object Near. An empty pin does nothing at all, so a failed lookup upstream is harmless.

Amount — health points removed, on the target's own scale.

Zone (blank = whole) — leave it blank to hit the entity's overall health. Fill in a damage zone name to hit one part; the names belong to the model, so a character has zones like "Head" and "Torso" while a vehicle has its own set. A name the model does not have does nothing, with no warning — leave it blank unless you know the zone exists.

Example

A hazard area that hurts, built without any item or effect. Place While Player In Zone (Center Position 3800 0 6000, Radius 40, Every (seconds) 5) → Damage Entity with Entity wired from the event's Player and Amount 4 → Send Notification to the same player ("Your skin is burning"). Standing in it costs four health every five seconds, and walking out stops it.

Compare that with the Toxic zone template (File → New from template). It talks more than the wiring above does — Player Entered Zone sends a notification, While Player In Zone sends another every five seconds, and Player Left Zone sends the all-clear — but it never takes a single point of health off anyone. Hang Damage Entity off its five-second chain and it stops being a warning sign.

Watch out

  • A corpse is still an object. If you damage everything in a radius, dead bodies and dropped loot are in that list too; gate on Is Player Alive when only the living should be hurt.
  • Damage on a player is applied by the server, so it works for players who have no mod installed. Nothing about this node needs a client half.
  • Points, not percent. Copying an amount that felt right on a player onto a vehicle does nothing visible — read the target back with Get Entity Health (0 to 1) while you are tuning.
  • Enough damage kills. There is no "leave them at 1 health" safety net here, and a player killed this way has no killer to credit.

Kill Entity

actionserveraction.killEntity

Destroys any entity by setting its health to zero (kills creatures, ruins items).

Inputs
(exec)exec
Entityobject
Outputs
(exec)exec

Sets a thing's health to zero. What that means depends on what it is: an infected or animal dies, a player dies, an item is ruined, a vehicle is wrecked. The object stays in the world in its destroyed state — a corpse, a ruined rifle, a burnt-out car.

That last part is the distinction worth holding on to. This node destroys; it does not tidy up. Delete Entity is the one that makes something vanish as if it had never existed.

When to use it

Killing creatures on command — clearing an arena of infected, ending an event's spawns — or ruining an item deliberately. For players, Kill Player says what it means and reads better in a graph. To remove something without leaving remains, use Delete Entity; for dropped loot in an area, Delete Items In Radius clears the ground in one go. To hurt without finishing, Damage Entity.

Pins

Entity — a creature, item, vehicle or player. An empty pin does nothing, so it is safe to wire straight from a lookup that may find nothing.

Example

A field that destroys whatever a player carries into it. Place While Player In Zone (Center Position 5900 0 2400, Radius 25, Every (seconds) 4) → Get Item In Hands on the event's Player → Branch on Is Valid → True → Kill Entity on that item → Send Notification ("Your equipment is ruined"). The item stays in their hands as a ruined version of itself, which reads far better to the player than it silently disappearing.

The Is Valid check is doing real work there: a player walking through empty-handed produces nothing to kill, and wiring an empty item into this node would simply be a no-op anyway.

Watch out

  • Inside For Each Object Near every object is a candidate — players, their dropped gear, parked cars, even the buildings. Narrow the list before killing in bulk: Cast To Player separates players from the rest, Is Item Of Type matches a classname on a plain object, and Get Item Tag recognises items your own mod created. Engine state alone will not tell you what an object is for.
  • Corpses and wrecks stay. They despawn on the game's own schedule, so a sweep that runs often will pile bodies up; follow with Delete Entity if the remains are the problem.
  • Nothing is credited with the kill. A creature killed this way has no killing player, so a bounty built on On Creature Killed has nobody to pay.

Repair Entity

actionserveraction.repairEntity

Fully repairs any object, item, or vehicle to full health.

Inputs
(exec)exec
Entityobject
Outputs
(exec)exec

Puts an object back to full health in one step — pristine condition, every damage zone included. It works on anything: a wrecked car, a damaged tent, a badly worn rifle.

Repair means condition and nothing else. A car comes out undented but still empty of fuel, a magazine comes out pristine but still empty of rounds.

When to use it

Service points and admin conveniences: a garage that fixes what you drive up in, a reward that restores a player's gear. For part of the way rather than all of it, Set Item Health takes a value or a percentage and can target a single zone. For fluids use Refuel Vehicle, and for a magazine's rounds Set Magazine Ammo. The opposite direction is Damage Entity.

Pins

Entity — anything with health. An empty pin does nothing, so an upstream lookup that found nothing simply skips.

Example

A repair bay: While Player In Zone (Center Position 4500 0 8100, Radius 8, Every (seconds) 3) → Get Player Vehicle on the event's Player → Branch on Is Valid → True → Repair Entity on that vehicle → Refuel Vehicle (Fluid Fuel, Mode Fill To Full) → Send Notification ("Serviced"). Drive in, wait a moment, drive out whole. Players on foot fail the Is Valid check and are left alone.

Watch out

  • Repairing does not refill. Fuel, water, ammunition and every other quantity stay exactly where they were.
  • It is total. There is no "repair by 20%" here; use Set Item Health when partial repair is the point.

Actions/Effects

Play Sound At Position

actionclientaction.playSoundAtPosition

Plays a sound in the world at a position, heard by every player nearby. Sound set names come from the game or a mod (e.g. Explosion_MortarShell_SoundSet). Players need the mod installed to hear it.

Inputs
(exec)exec
Positionvector
Outputs
(exec)exec
Settings
Sound settext · default "Explosion_MortarShell_SoundSet"required

Plays a sound in the world at a point on the map. Everyone close enough hears it, from the right direction, and it fades with distance the way any game sound does.

Worth knowing how it gets there, because it explains the rules below. Sound only exists on a player's machine — a server has no speakers. So this node does not play anything itself: it sends every connected player a small message saying "play this sound set, here", and the mod's half on their machine does the playing. The distance falloff then happens naturally on each client, so a player across the map receives the message and hears nothing.

When to use it

Anything that should be heard where it happens: an explosion, a siren, a horn at a trader, a warning before an event. For a sound only one person should hear, Play Sound For Player plays at that player's own position instead. For something seen rather than heard, Spawn Particle Effect. When the point is to tell players something in words, Broadcast Notification needs no mod on their side at all.

Pins

Position — where the sound comes from. Height matters as much as it does for anything else in the world; a height of 0 is sea level.

Sound set — the name of a sound set from the game or another mod, typed exactly. The default, Explosion_MortarShell_SoundSet, is a loud one-shot blast. A name that does not exist plays nothing at all, with no error.

Example

Giving a scripted blast its bang: Spawn Particle Effect (Large fire) → Play Sound At Position (Explosion_MortarShell_SoundSet) → Create Explosion, all three taking the same position. The explosion node deals the damage and this one supplies the noise — on its own, the blast is completely silent.

Watch out

  • This needs the mod on players' machines. In a project set to "Server only" the editor refuses the node and tells you to switch to "Server + Client" in Project Settings. Players who then join without the mod hear nothing; the server-side half of your graph still runs normally for them.
  • Nothing stops a sound once it starts — there is no handle to it. Stick to short, one-shot sound sets.
  • The message goes to every player on the server, no matter how far away they are. That is fine for events; do not put this node inside a loop that runs many times a second.
  • Sound set names are exact and case-sensitive, and a typo is silent. Test with the default first, so you know the wiring works before you go hunting for names.

Play Sound For Player

actionclientaction.playSoundForPlayer

Plays a sound for ONE player, at their own position — only they hear it. Good for personal feedback (a reward chime, a warning). Players need the mod installed to hear it.

Inputs
(exec)exec
Playerplayer
Outputs
(exec)exec
Settings
Sound settext · default "Explosion_MortarShell_SoundSet"required

Plays a sound for exactly one player. Nobody else hears it, and because it plays at that player's own position it starts right next to them — full volume, wherever in the world they are.

That makes it the audio version of a private notification. Where Play Sound At Position puts a sound in the world for everyone nearby, this puts one in a single player's ears.

When to use it

Personal feedback: a chime when a reward lands, a warning when a player's own timer runs out, a click confirming an action worked. For a sound that belongs to a place rather than a person, use Play Sound At Position. For words on screen, Send Notification — which has the advantage of working for players with no mod installed.

Pins

Player — who hears it. An empty pin does nothing, so wiring it from a lookup that may come back empty is safe.

Sound set — a sound set name from the game or a mod, typed exactly. A name that does not exist plays nothing, silently.

Example

Making a payout audible. The Kill reward template (File → New from template) hands the killer an item when they get a kill; adding Play Sound For Player to that chain, with the Player pin wired from the event's Killer, means the reward announces itself even if the player is not looking at the corner of their screen.

Watch out

  • This needs the mod on players' machines. A project set to "Server only" will not accept the node — switch it to "Server + Client" in Project Settings. A player who joins without the mod hears nothing, while the rest of the chain still runs for them.
  • The sound is pinned to a spot in the world, not to the player. The server reads their position the moment the node runs and the sound plays there, fixed, for as long as it lasts — it does not follow them. On a short chime you will never notice; a player sprinting away hears a longer one fall behind. There is no way to aim it anywhere else, so use Play Sound At Position when the sound belongs to a place.
  • Once started, a sound cannot be stopped from a graph. Keep to short, one-shot sound sets.

Spawn Particle Effect

actionclientaction.spawnParticleEffect

Shows a visual effect (fire, smoke, steam...) at a position for every player nearby. Players need the mod installed to see it. The effect plays once where you put it; it does not follow anything.

Inputs
(exec)exec
Positionvector
Outputs
(exec)exec
Settings
Effectselect · Small fire | Large fire | Fire starting | Fire dying out | Small smoke | Large smoke | House fire | House smoke | Barrel fire | Steam · default "Small fire"required

Shows a visual effect at a point on the map — fire, smoke or steam, picked from a short list of the game's own effects. Every player near enough to see that spot sees it.

Like sound, particles only exist on players' machines; the server has nothing to draw with. So this node sends every connected player a message saying "play this effect, here", and the mod's half on their machine draws it. That is why the effect needs the mod installed on the player's side, and why a player who connects a minute later sees nothing — the message has been and gone.

When to use it

Marking a moment or a place: the fireball of a scripted explosion, smoke over an airdrop, steam from a vent. It is a burst of feedback, not scenery — there is no handle to move it, stop it, or attach it to anything, and it does not follow whatever you spawned it over. For something that must be there permanently, spawn a real object with Spawn Static Object. For the noise to go with it, Play Sound At Position.

Pins

Position — where the effect appears. A height of 0 is sea level, so smoke meant to rise off the ground needs a real height: run config or computed positions through Snap To Ground first.

Effect — one of the ten built-in choices (Small fire through House smoke, plus Steam). They are the game's own campfire and building-fire effects, so their size is fixed — pick the one whose scale suits, rather than expecting to resize it.

Example

A crate drop you can see from a distance. Every N SecondsSet Global Position ("drop") from Random Config PositionSpawn Item (SeaChest) at that point → Spawn Particle Effect (Large smoke) at the same point → Broadcast Notification ("Supplies dropped"). To keep the marker alive while players run to it, fire the effect again a few times on a short Delay chain; one call is one puff.

Watch out

  • The mod has to be on players' machines. A "Server only" project refuses the node and points you at Project Settings; players without the mod see nothing while the rest of the graph still works for them.
  • Only people connected at that instant see it. Nothing about the effect persists, so it cannot mark a place for someone who arrives later.
  • Every call is a separate effect. Calling it in a fast loop stacks effects on top of each other on every client and costs them frames.
  • The message goes to all players regardless of distance; the effect is simply out of sight for anyone far away.

Actions/Feedback

Broadcast Chat Message

actionserveraction.broadcastChatMessage

Sends a chat line to every player on the server. Style is the colour: Action is gold (#F7CA18), Important red (#F22613), Friendly green (#2ECC71) and Info blue (#4B77BE). Gold and red carry furthest over the game world; the blue is a muted mid-tone that vanilla mostly emits as BLANK spacer lines, so a number you need read gets lost in it. Reach for Action by default and Important for a warning.

Inputs
(exec)exec
Textstring
Outputs
(exec)exec
Settings
Styleselect · Info | Action | Friendly | Important · default "Info"required

One line of text in everybody's chat. Unlike the notification broadcast, this really is a loop: the generated code takes the server's current player list and sends the line to each player in turn. Vanilla clients receive it without any mod installed.

Style picks one of the game's own chat colours for the line. It has no effect on who receives it.

When to use it

Announcements that belong in the log rather than on the screen: killfeed lines, event chatter, "the trader is open". When the message must be seen, Broadcast Notification puts a box in front of every player instead. When only one person needs it, Send Chat Message.

Pins

Text — the line. Assemble it from live values with Join Text.

Style (panel) — Info, Action, Friendly or Important. Colour only.

Example

A simple killfeed: On Player DiedIs Valid (Killer) → Branch → on the True side, Get Player Name (Killer) and Get Player Name (Victim) feed two Join Text nodes to build "Dave killed Mike" → Broadcast Chat Message (Style Important). The Is Valid gate keeps bleed-outs and falls out of the feed, where the killer would be blank.

Watch out

  • It walks the whole player list every time it runs. Put it inside For Each Player and every player triggers a message to everybody — sixty players means 3600 chat lines from one event. Broadcasts belong outside loops.
  • The list it walks is the engine's raw player list, which includes bodies that have not despawned yet. Harmless for a chat line, but it means "everyone who got the message" is not the same as "everyone alive".
  • Style is colour only. Nothing about "Important" makes the line stay longer or stand out beyond its colour.
  • Chat is easy to drown. On a repeating timer, keep the interval long; behind a condition that stays true, gate with Do Once.
  • Server node. Under a menu or key event, the chain moves to the server from here, so client-only nodes (Set Widget Text, Close Menu, the HUD nodes) have to come first.
  • Style is the colour, and they are not equally legible: Action is gold

(#F7CA18), Important red (#F22613), Friendly green (#2ECC71), Info blue (#4B77BE). Gold and red carry furthest over the game world. The blue is a muted mid-tone that vanilla mostly emits as blank spacer lines, so a number you actually want read gets lost in it — which makes the default the worst choice for anything numeric.

Broadcast Notification

actionserveraction.broadcastNotification

Shows a notification to every player on the server. Works for all players with no mod installed.

Inputs
(exec)exec
Titlestring
Detailstringoptional
Show Secondsfloat
Outputs
(exec)exec

The same top-right pop-up as Send Notification, but for everybody on the server at once. There is no Player pin: the node tells vanilla's notification system "no particular player", which the engine reads as "all of them". That is a single call rather than a loop, so it costs the same whether three people are online or sixty — and it reaches unmodified clients, so a server-only mod can announce things to a whole population.

When to use it

Server-wide announcements: restart warnings, an event starting, a rule change, a killfeed line everyone should see. When the message concerns one person, use Send Notification so you are not spamming the server. When it should sit quietly in the chat log instead of covering the corner of everyone's screen, use Broadcast Chat Message.

Pins

Title — the bold headline.

Detail — optional second line.

Show Seconds — 1 to 60.

Example

A restart warning that fires once per cycle: Every N Seconds (30) → Get Server UptimeGreater Than (14100) → Branch → the True side runs Do OnceBroadcast Notification ("Restart", "Server restarts in 5 minutes — log out safely", 20 seconds). Without the Do Once, everyone gets the same warning twice a minute until the server goes down.

An event announcement built from live numbers: Get Online Player CountJoin Text ("Players online: " + the count) into the Detail pin.

Watch out

  • Everyone means everyone, including the player whose action triggered it. When the trigger is personal — a kill, a purchase — send them their own Send Notification and broadcast only the part the server needs to know.
  • It is easy to make this annoying. On a timer, keep the interval generous; behind a condition, gate it with Do Once or a stored flag so a condition that stays true does not re-announce on every check.
  • This is a server node. Under a menu or key event the chain moves to the server from here on, so put client-only work (Set Widget Text, Close Menu, the HUD nodes) before it.
  • Players still on the loading screen are not a reliable audience for a one-shot announcement. Anything a joining player must see belongs on On Player Ready with Send Notification instead.

Log Message

actionserveraction.logMessage

Writes a line to the server log. Players never see it — use it to check your graph is working.

Inputs
(exec)exec
Textstring
Outputs
(exec)exec

Writes one line into the server's script log — the .RPT file in your server profile folder. Players never see it. This is the node you use to find out whether your graph is doing what you think: drop it into a chain and the log tells you the branch was reached and what the value was.

Every line is stamped with your mod's name in square brackets before your text, so you can filter the whole file down to your own output even on a server running a dozen other mods.

When to use it

Testing and troubleshooting. Put one on each side of a Branch and the log tells you which way the condition went; put one inside a loop and you can count the passes. For a record that must survive the restart and live in its own file, use Write To Log File. For anything a player should read, use Send Notification or Send Chat Message.

Example

Proving a reward chain fires: On Player DiedIs Valid (Killer) → Branch; the True side runs Get Player Name (Killer) → Join Text ("paid reward to " + the name) → Log Message, and the False side runs a Log Message reading "no killer — skipped". Two lines in the log and you know instantly whether the problem is the reward or the killer resolution.

Checking an unfamiliar value: Get Ground SurfaceLog Message prints the surface names your map actually uses, so you can write the comparison against real text instead of guessing.

Watch out

  • Nothing here reaches a player, ever. A "message" that never showed up in-game is usually this node when Send Notification was meant.
  • The .RPT starts fresh each time the server launches, so a line you logged last session is gone. Use Write To Log File for anything you need to keep.
  • Logging inside a fast timer or a per-player loop grows the file quickly and makes the interesting lines hard to find. Take the diagnostic logs back out once the graph works.
  • This is a server node. Under a menu or key event the chain hands off to the server from this node onward, so client-only nodes — Set Widget Text, Close Menu, the HUD nodes — must sit before it.

Send Chat Message

actionserveraction.sendChatMessage

Sends a chat line to one player. Style is the colour: Action is gold (#F7CA18), Important red (#F22613), Friendly green (#2ECC71) and Info blue (#4B77BE). Gold and red carry furthest over the game world; the blue is a muted mid-tone that vanilla mostly emits as BLANK spacer lines, so a number you need read gets lost in it. Reach for Action by default and Important for a warning.

Inputs
(exec)exec
Playerplayer
Textstring
Outputs
(exec)exec
Settings
Styleselect · Info | Action | Friendly | Important · default "Info"required

Puts a line of text in one player's chat, exactly as if the server had spoken to them. It is the quiet channel: no box covering the screen, no timer, just a line in the log that scrolls with everything else. Vanilla clients receive it with no mod installed.

The Style setting picks which of the game's own chat colours the line is drawn in. It changes nothing else — every style goes to the same player, in the same place, with the same reliability.

When to use it

Feedback that is useful but not urgent: confirming a purchase, reporting a balance, answering a command. When the player must not miss it, use Send Notification — a box in the corner is far harder to scroll past. To say the same thing to everybody, use Broadcast Chat Message.

Pins

Player — who receives the line. Nobody else sees it.

Text — the line itself. Build it from live values with Join Text.

Style (panel) — Info, Action, Friendly or Important. Colour only.

Example

Reporting a stored score on request: On Key PressedGet Player Number (kills) → Join Text ("Kills this session: " + the number) → Send Chat Message (Style Info) with the event's Player wired in. The player presses their key and gets one line back, without a box interrupting them.

Confirming a reward: On Player DiedIs Valid (Killer) → Branch → True → Give Item To Player (Rag) → Send Chat Message ("Kill reward: 1 Rag", Style Friendly) on the Killer.

Watch out

  • The Player pin goes straight to the engine with no check of its own — an empty player here is not a dependable no-op. Gate risky sources (the Killer of a self-inflicted death, a Get Nearest Player miss) behind Is Valid and a Branch.
  • Chat scrolls away and fades. Anything the player has to act on belongs in Send Notification.
  • Style is colour, not routing. "Important" does not make the line stickier, louder or more visible than "Info".
  • This is a server node. Under a menu button or key press the chain hands off to the server here, so client-only nodes — Set Widget Text, Close Menu, the HUD nodes — must come before it in the chain.
  • After a Delay only the carried player survives. Rebuild the text from the player after the wait, or stamp it on them beforehand with Set Player Text and read it back.
  • Style is the colour, and they are not equally legible: Action is gold

(#F7CA18), Important red (#F22613), Friendly green (#2ECC71), Info blue (#4B77BE). Gold and red carry furthest over the game world. The blue is a muted mid-tone that vanilla mostly emits as blank spacer lines, so a number you actually want read gets lost in it — which makes the default the worst choice for anything numeric.

Send Notification

actionserveraction.sendNotification

Shows a notification box in the top-right corner of one player's screen. Works for every player — they do not need any mod installed.

Inputs
(exec)exec
Playerplayer
Titlestring
Detailstringoptional
Show Secondsfloat
Outputs
(exec)exec

The pop-up box in the top-right corner of one player's screen: a bold title, an optional line of detail under it, and a countdown until it fades. This is vanilla's own notification system — the engine pushes the box to that player's client for you — so it works on a completely unmodified client. A server-only mod can talk to its players through this node and nobody has to install anything.

Because the message is aimed at one player, it is the node you reach for after something happened *to them*: they joined, they were rewarded, they broke a rule. Everyone else sees nothing.

When to use it

The default way to tell a single player something. To say it to the whole server instead, use Broadcast Notification. For a quieter line that lands in the chat log rather than covering the corner of the screen, use Send Chat Message. For a message only you should ever see, use Log Message. And when you want to control exactly how it looks and where it sits, build your own overlay with Show HUD Overlay and Set Text — at the cost of players needing the mod installed.

Pins

Player — who sees it. Everyone else is unaffected.

Title — the bold first line. Keep it short; it is a headline, not a sentence.

Detail — optional second line, for the explanation.

Show Seconds — how long the box stays. The editor accepts 1 to 60.

Example

The whole Welcome notification template (File → New from template) is two nodes: On Player ConnectedSend Notification, with the event's Player wired into the Player pin, Title "Welcome!", Detail "Welcome to the server — good luck out there." and Show Seconds 8.

Building the text from live values is the same shape with one more step: On Player DiedGet Player Name (Victim) → Join Text ("You killed " + the name) → Send Notification on the Killer, so the message names the person they just dropped. That wiring, guarded by Is Valid on the Killer, is the Kill reward template.

Watch out

  • The Player pin is handed straight to the engine with no check of its own. An empty player — the Killer of a bleed-out, a Get Nearest Player that found nobody — is not a reliable no-op here. Put Is Valid into a Branch and send on the True side.
  • This node runs on the server. Under a client event (On Button Clicked, On Key Pressed) the chain hands off to the server from here onward, so any client-only work — Set Widget Text, Close Menu, the HUD nodes — has to come BEFORE it, or the editor rejects the graph.
  • After a Delay only the carried player survives. A name or number you looked up before the wait is gone by the time the notification runs — re-derive it from the player, or stamp it on them first with Set Player Text and read it back.
  • One box at a time is what a player can actually read. Firing one every second from a timer buries the message that mattered; for anything that repeats often, use a longer interval or drop to Send Chat Message.

Actions/HUD

Add Widget From Layout

actionclientaction.hudAddWidget

Creates a new copy of a layout inside a parent widget (e.g. a card in a list) and gives you the new widget. Use a container widget (like a Grid) as the parent so copies stack.

Inputs
(exec)exec
Parentwidget
Outputs
(exec)exec
New Widgetwidget
Settings
LayoutlayoutPickerrequired

Stamps a fresh copy of a layout inside a widget you already hold, and gives you the copy's own handle. This is how a list of unknown length gets on screen: the overlay layout holds an empty container, a second small layout describes one row or one card, and this node adds a copy per entry.

Nothing here is cached. Unlike Show HUD Overlay, which hands back the same overlay however often you call it, every run of this node creates another copy. That is exactly what a killfeed wants, and a trap for anything that should exist once.

When to use it

Repeated pieces: killfeed cards, scoreboard rows, one marker per objective. The containing overlay itself comes from Show HUD Overlay. To rebuild a whole list rather than grow it, run Clear Widget Children on the container first and then one Add per entry — that pair lets a list of any length refresh without old rows piling up.

Pins

Parent — the widget the copy is nested inside. Use a container from your overlay (a Find Child Widget on the Root), not the Root itself, so copies stack in the order you add them instead of landing on top of each other. An empty Parent creates nothing, and New Widget comes back empty.

Layout (property) — the layout to copy. Any attached layout works; a small one holding a single card is the usual shape.

New Widget — the copy's own root. Look up labels *inside this handle*, never from the overlay Root.

Example

Continuing a killfeed. A second layout killcard holds three text widgets named CardKiller, CardWeapon and CardVictim. Under On Client Message "kill": Show HUD Overlay (killfeed) → Scale For ScreenAdd Widget From Layout (Layout killcard, Parent = Find Child Widget on the Root with Name "Cards") → Scale For Screen again, this time with Root Widget = New Widget and Layout killcard → three Set Text nodes, each fed by a Find Child Widget of New WidgetAuto-Destroy Widget After on New Widget after 6 seconds.

Watch out

  • Search for children inside the New Widget. A name lookup walks the whole tree under whatever you hand it, so searching from the overlay Root always finds the *first* card's label — every kill would then rewrite card one.
  • Scale each copy. Scale For Screen on the overlay does not reach a card added afterwards; run it again on New Widget, with the card's own layout selected.
  • Nothing removes the copies for you. Pair with Auto-Destroy Widget After or Clear Widget Children, or a busy server buries the screen in cards.
  • Client-side only: Server + Client project, and the node must come before any server action in its chain. Delay is a server node and cannot sit between two HUD nodes.

Auto-Destroy Widget After

actionclientaction.hudAutoDestroy

Removes a widget on its own after a number of seconds (e.g. a killfeed card that fades out).

Inputs
(exec)exec
Widgetwidget
Secondsfloat
Outputs
(exec)exec

Books a widget's removal for a number of seconds from now, and carries straight on. The graph does not wait: the rest of the chain runs immediately, and the widget quietly disappears later on its own.

That "does not wait" is the whole point of the node. Delay is a server-side node, so it cannot sit between two HUD nodes — put one there and everything after it is handed to the server, where widgets do not exist. This node is the client's timer, and it is the supported way to make a HUD element temporary.

It removes; it does not fade. The widget is there and then it is not.

When to use it

Anything that should appear briefly and go: killfeed cards, a "+1 kill" flash, a pickup toast, a warning banner. For a HUD element that stays until something else happens, use Destroy Widget at that moment instead, or Set Widget Visible to keep it around unseen.

Pins

Widget — the widget to remove, usually the New Widget from Add Widget From Layout. An empty handle books nothing.

Seconds — from 0.1 up to 120. Six is the default and reads well for a killfeed; a card that stays longer than the next few kills turns the corner of the screen into a wall.

Example

A killfeed card that clears itself. Under On Client Message "kill": Show HUD Overlay (killfeed) → Scale For ScreenAdd Widget From Layout (killcard into the container named "Cards") → Scale For Screen on the new card → Set Text on its labels → Auto-Destroy Widget After on the New Widget, Seconds 6.

The overlay itself is never removed — it is created once and reused — while each card lives six seconds and then goes.

Watch out

  • The booking cannot be cancelled or shortened once made. Destroying the widget earlier by hand is safe, though: when the timer comes round there is simply nothing left to remove.
  • Book it against a card, not against the Root of an overlay. An overlay is remembered by layout, and Destroy HUD Overlay is the node that removes one properly.
  • Booking twice on the same widget books two removals; the second finds nothing and does nothing, which is harmless but a sign the chain is running more often than you think.
  • Client-side only: Server + Client project, and the node must sit before any server action in its chain.

Clear Widget Children

actionclientaction.hudClearChildren

Removes everything inside a widget, leaving the widget itself. The other half of Add Widget From Layout: clear the container, then add a row per entry, and a list of any length rebuilds without piling up old rows.

Inputs
(exec)exec
Widgetwidget
Outputs
(exec)exec

Empties a widget: everything inside it is removed, the widget itself stays. It walks the children one by one, taking care to note the next one before removing the current one, so a full list is cleared in a single pass however long it is.

This is the other half of Add Widget From Layout. Clear the container, then add one copy per entry, and a list of any length rebuilds itself without old rows piling up underneath the new ones.

When to use it

Any list that is refreshed rather than appended to: a scoreboard that redraws every few seconds, a nearby-players panel, a quest list. For a feed where old entries should linger and then go on their own — a killfeed — leave the container alone and give each card an Auto-Destroy Widget After instead. To remove a single widget you are holding, use Destroy Widget; to take the whole overlay down, Destroy HUD Overlay.

Pins

Widget — the container to empty, normally a Find Child Widget on the overlay Root. Aim carefully: pointing this at the Root itself empties the entire overlay, headers and frames included, and only Destroy HUD Overlay followed by a fresh show will bring them back.

Example

A scoreboard that redraws on every refresh. The server's ranked loop sends one Broadcast Client Message named "board_start" before it begins, then one "row" per player. On the client: On Client Message "board_start" → Show HUD Overlay (scoreboard) → Scale For ScreenClear Widget Children on Find Child Widget "Rows". A second client graph on On Client Message "row" then adds one row per message. Rows never double up, because the container was emptied before the first of them arrived.

Watch out

  • Order the messages so the clear always lands before the rows. Two graphs listening for two different message names is the clean way to guarantee it; clearing inside the per-row handler would wipe out the previous row every time.
  • The cleared children are gone, not hidden. Any widget handle your graph is still holding from before the clear now points at nothing, and nodes using it do nothing.
  • An empty Widget handle clears nothing and says nothing.
  • Client-side only: Server + Client project, and before any server action in the chain.

Destroy HUD Overlay

actionclientaction.hudDestroyOverlay

Removes an overlay you showed earlier.

Inputs
(exec)exec
Outputs
(exec)exec
Settings
LayoutlayoutPickerrequired

Takes an overlay off the screen and forgets it, so a later Show HUD Overlay builds a fresh one from the layout. It finds the overlay by its layout rather than by a widget handle, so you can remove it from anywhere on the client without threading the Root through your graph.

This is a teardown, not a pause. Everything done to that overlay goes with it: text you set, sizes you computed, cards you added, and the screen scaling.

When to use it

When a HUD element is finished — the round ended, the player left the zone, the event is over. For something you will show again in a moment, Set Widget Visible on the Root is cheaper and keeps the contents intact. To empty a list but keep its frame, use Clear Widget Children; to remove one card inside an overlay, Destroy Widget.

Pins

Layout (property) — the same layout you passed to Show HUD Overlay. A different layout removes a different overlay, and a layout that was never shown does nothing at all.

Example

A round timer that vanishes when the round ends. The server sends one Broadcast Client Message named "round_end" when the clock runs out; on the client, On Client Message "round_end" → Destroy HUD Overlay (Layout roundtimer). Every player's timer disappears together, and the next round's first "round_tick" message rebuilds it through Show HUD Overlay.

Watch out

  • After a destroy, the next Show returns a brand new, empty overlay. Re-run Scale For Screen and re-set every text — nothing survives.
  • Client-side only: the project must be Server + Client, and the node must sit before any server action in its chain, or it lands in the server half and never touches the screen.
  • Destroying an overlay that is not showing is safe and does nothing, so you do not need to track whether it is up.

Destroy Widget

actionclientaction.hudDestroyWidget

Removes a widget from the screen.

Inputs
(exec)exec
Widgetwidget
Outputs
(exec)exec

Removes one widget from the screen, along with everything nested inside it. It is immediate and permanent: the handle you were holding is spent, and only Add Widget From Layout or a fresh Show HUD Overlay can produce another.

When to use it

Taking down a single piece you created — one card, one row, one marker — when your graph knows the moment it should go. When the moment is simply "a few seconds from now", Auto-Destroy Widget After schedules it for you and needs no timer. To empty a container but keep it, use Clear Widget Children; to remove a whole overlay, use Destroy HUD Overlay, which also forgets it so a later show rebuilds it.

Example

A "capturing" marker that disappears the moment the point is taken. The server sends Broadcast Client Message "capture_start" and later "capture_done". On the client, the first message shows the overlay and adds a marker card with Add Widget From Layout; the second — On Client Message "capture_done" → Destroy Widget on Find Child Widget of the overlay Root, Name "Marker" — takes it away again.

Watch out

  • Do not point it at the Root of an overlay from Show HUD Overlay. That overlay is remembered by layout, and removing it this way skips the bookkeeping; Destroy HUD Overlay is the node that both removes it and forgets it.
  • To hide something you will want back, use Set Widget Visible. Destroying and rebuilding loses every text you set and every size you computed, and needs Scale For Screen run again.
  • An empty Widget handle destroys nothing and reports nothing, so a mistyped name in Find Child Widget looks the same as a widget that refuses to go away.
  • Client-side only: Server + Client project, and before any server action in the chain.

Fit Widget To Text

actionclientaction.hudFitToText

Shrinks a text widget to exactly the width of the text in it. Set the text FIRST, then fit. Put the fitted widgets in a spacer and the row packs tight, so a short name leaves no dead space beside it.

Inputs
(exec)exec
Text Widgetwidget
Padding (px)floatoptional
Outputs
(exec)exec

Shrinks a text widget to exactly the width of the text currently in it, plus whatever padding you ask for. A fixed-width label leaves a short name rattling around inside a wide dark box; this measures the string as it actually draws and sets the widget's width to match.

Only the width changes. The height is handed back as "fill", which keeps a label that is not exact-height at the full height of the row it sits in — the shape a row of labels wants. And a widget whose text is empty collapses to nothing rather than keeping the width it was laid out with, so an optional label that is switched off leaves no hole beside the others.

When to use it

Any label whose content varies: a player name, a weapon name, a score. Put several fitted labels inside a spacer and the row packs tight by itself. When you need the number rather than the effect — to position the next widget by hand, or to size a background panel around a whole row — read it with Text Width and use Set Widget Size or Set Widget Position.

Pins

Text Widget — must be an actual text widget; anything else measures 0 and collapses.

Padding (px) — breathing room added to the measured width. Optional; leave it out for a flush fit, 8–14 px is comfortable inside a coloured background.

Example

A killfeed card that hugs its names. On the card layout, CardKiller and CardVictim are text widgets inside a spacer. Under On Client Message "kill": Show HUD OverlayScale For ScreenAdd Widget From Layout (the card) → Scale For Screen on the new card → Set Text on CardKillerFit Widget To Text on CardKiller (Padding 10) → the same pair for CardVictim. Long names and short names both come out evenly spaced.

Watch out

  • Set the text first. This node measures what is laid out at the moment it runs, so fitting before Set Text sizes the widget around the previous string — usually the layout's placeholder.
  • Scale before you fit. Scale For Screen changes the text size, so a fit taken beforehand is a 1080p width applied to a 4K label.
  • Empty text collapses the widget to zero width. That is deliberate, but it means a label whose value failed to arrive disappears rather than showing an empty box — check Find Child Widget first when a row looks short.
  • A non-text widget silently ends up at zero width. Fit the label, not the panel behind it.
  • Client-side only: Server + Client project, and before any server action in the chain.

Scale For Screen

actionclientaction.hudScaleForScreen

Resizes a HUD element so it looks the same on any screen. Layouts are drawn at 1080p and exact sizes are real pixels, so on a 1440p or 4K screen a HUD keeps its pixel count and shrinks. Run this right after Show Overlay (or Add Widget From Layout) and everything in it — positions, sizes and text — grows with the screen. Pick the layout it was built from; anything positioned as a fraction is left alone, since that already scales.

Inputs
(exec)exec
Root Widgetwidget
Outputs
(exec)exec
Settings
LayoutlayoutPickerrequired

Makes a HUD the same apparent size on every monitor. DayZ layouts are authored at 1080p, and anything the layout editor marks "exact" is measured in real, physical pixels — so an overlay that fills a 1080p screen takes up two-thirds the height on 1440p and half of it on 4K. This node walks the layout you name and multiplies every exact position, exact size and exact text size by the screen height divided by 1080. It is the same yardstick vanilla uses to size its own tabbed screens.

It works from the layout as you authored it, so it knows which widgets are exact and which are proportional. Anything positioned or sized as a fraction of its parent already scales by itself and is deliberately left alone — multiplying a 0.5 would fling it off screen.

When to use it

Immediately after Show HUD Overlay, and again after every Add Widget From Layout. Each created piece needs its own call with its own layout selected: scaling the overlay does not reach a card stamped into it afterwards.

Pins

Root Widget — the handle whose contents to scale: the Root from Show HUD Overlay, or the New Widget from Add Widget From Layout.

Layout (property) — the layout that widget was built from, and it must match. Text sizes cannot be read back from a live widget, so they are taken from the layout file itself; naming a different layout scales the wrong things.

Example

The killfeed, scaled twice. On Client Message "kill" → Show HUD Overlay (killfeed) → Scale For Screen (Root Widget = Root, Layout killfeed) → Add Widget From Layout (Layout killcard, Parent = the container named "Cards") → Scale For Screen again (Root Widget = New Widget, Layout killcard) → Set Text on the card's labels.

Watch out

  • It multiplies what is there now, so running it twice on the same overlay scales it twice. Show HUD Overlay hands back the *same* overlay on every message, so a chain that shows and scales on each kill compounds the overlay's size on any screen that is not 1080p. Scale the overlay behind a Do Once (on its own branch of a Sequence) and keep the per-message work on the other branch — cards added later still get their own scaling call, since each card is new.
  • Only the layout's root widget and widgets that have a name are touched. Give a name in the layout editor to anything that must scale; unnamed decoration keeps its authored pixels.
  • Scale first, then measure. Text Width and Fit Widget To Text report the text as it draws at that moment, so measuring before scaling hands you 1080p numbers.
  • A layout that uses no exact values has nothing to scale and this node does nothing — correct, not a fault.
  • On a 1080p screen the factor is exactly 1 and nothing visibly changes. Test at another resolution before deciding it works.
  • Client-side only: Server + Client project, and before any server action in the chain.

Set Text

actionclientaction.hudSetText

Sets the text on a text widget you found or created.

Inputs
(exec)exec
Widgetwidget
Textstring
Outputs
(exec)exec

Writes a line of text into a text widget. This is the node that actually puts a value on the screen — everything else in the HUD family is plumbing to reach the right widget with the right handle.

It only works on text widgets. Give it a panel, an image or a container and nothing happens, with no error anywhere, so a value that never appears is usually a widget of the wrong class rather than a broken wire.

When to use it

Every number, name or message a HUD shows. For a widget in an open menu, Set Widget Text does the same job by picking the widget from a dropdown. To assemble the string first, use Join Text; to force a house style, Change Text Case.

Pins

Widget — a handle, normally from Find Child Widget. An empty handle is a silent no-op.

Text — a number wired straight onto this pin converts to text on its own, so you do not need a conversion node. The Number pins on On Client Message are decimals, though, so send a score or a rank through To Whole Number (or Round Number) first if you want "7" and not a trail of decimal places.

Example

A scoreboard row. On the server, For Each Player (Ranked) sends one Broadcast Client Message named "row" per player, carrying Get Player Name in Text 1, the loop's Rank in Number 1 and its Value in Number 2. On the client, On Client Message "row" → Show HUD Overlay (scoreboard) → Add Widget From Layout (scorerow into the container named "Rows") → three Set Text nodes on Find Child Widget lookups of the new row for RowRank, RowName and RowScore, with the two numbers passed through To Whole Number on the way in.

Watch out

  • Set the text *before* Fit Widget To Text or Text Width. Both measure what is laid out at that instant, so fitting first sizes the widget around the previous string.
  • The widget must be a text widget in the layout editor. A styled panel with a label inside it means the label is your target, not the panel.
  • An empty Widget handle does nothing quietly — check the Name spelling and the Parent on the Find Child Widget feeding it.
  • Client-side only: Server + Client project, and before any server action in the chain.

Set Widget Position

actionclientaction.hudSetPosition

Moves a widget to a position in pixels, relative to its parent. Pair it with Text Width to lay a row out yourself: measure each label, then place them one after another. That works the same on every screen, where leaving it to a spacer depends on how the container is set up.

Inputs
(exec)exec
Widgetwidget
X (px)float
Y (px)float
Outputs
(exec)exec

Moves a widget to an X/Y spot measured from its parent's top-left corner — not from the corner of the screen. X grows to the right, Y grows downward, and a widget living inside a container moves within that container.

This is deliberate hand layout. DayZ's automatic arrangement helps only in particular set-ups — "size to content" exists on spacer widgets, never on the panel that draws your background — so when a row has to pack tightly around text of unknown length, measuring each label with Text Width and placing the next one yourself is the approach that behaves the same on every machine.

When to use it

Laying a row out from measured widths, centring something whose size you just computed, nudging a card into place. To change how big a widget is instead, use Set Widget Size; to shrink a text widget onto its own text, Fit Widget To Text.

Pins

X (px) / Y (px) — pixels for a widget the layout editor marks as an exact position on that axis. A widget positioned proportionally reads them as a fraction of its parent, where 0.5 is the middle and 300 is far off screen.

Example

A label and value that stay tight together whatever the label says. Layout banner holds text widgets Label and Value inside a panel. On the client: Show HUD Overlay (banner) → Scale For ScreenSet Text on LabelFit Widget To Text on Label with 8 px padding → Set Widget Position on Value, with X from a Add of Text Width of Label plus 8, and Y of 0.

Watch out

  • Measure after the text is set and after scaling, in that order. Text Width reports what is drawn right now, so a width taken before Set Text describes the old string and one taken before Scale For Screen is a 1080p number you then use on a 4K screen.
  • Scale For Screen reads positions back and multiplies them, so a position set before it is scaled too, and one set after stands as raw pixels.
  • Positions are relative to the parent. Moving a killfeed card by 200 px moves it 200 px inside its container, which may be nowhere near 200 px down the screen.
  • Client-side only: Server + Client project, and before any server action in the chain.

Set Widget Size

actionclientaction.hudSetSize

Sets a widget's size in pixels. Use it to grow a panel to fit what is in it — a scoreboard that gets taller as more players join.

Inputs
(exec)exec
Widgetwidget
Width (px)float
Height (px)float
Outputs
(exec)exec

Sets a widget's own width and height. Use it when the size depends on something the layout could not know in advance: a scoreboard panel that grows a row at a time, a background that has to be as wide as the name printed on it.

The numbers mean pixels only for a widget the layout editor marks as an exact size on that axis. A widget sized proportionally reads them as a fraction of its parent instead, and a "640" sent to one of those throws it far off screen — so set the size mode in the layout editor before you drive it from a graph.

When to use it

Whenever the size is arithmetic: rows times row height, or a sum of measured label widths from Text Width. When you only want a text widget to hug its own text, Fit Widget To Text does it in one node and needs no measuring. To move a widget rather than resize it, use Set Widget Position.

Example

A scoreboard panel that grows with the board. After its ranked loop, the server sends a closing Broadcast Client Message named "rows" carrying Get Online Player Count in Number 1. On the client: On Client Message "rows" → Show HUD Overlay (scoreboard) → Scale For ScreenSet Widget Size on Find Child Widget "Board", Width 640 and Height from a Multiply of Number 1 by 34 — one row of 34 px per player.

Watch out

  • Order against scaling matters. Scale For Screen reads a widget's current size back and multiplies it, so a size set *before* the scaling gets scaled with everything else, and a size set *after* stands as raw physical pixels — tiny on a 4K screen. Pick one and be consistent: sizes computed from Text Width are already in screen pixels, because they measure text as it draws.
  • Height and width are both applied every time, so passing a "keep it as it is" value means reading nothing back — decide both numbers.
  • An empty Widget handle does nothing quietly.
  • Client-side only: Server + Client project, and before any server action in the chain.

Set Widget Visible

actionclientaction.hudSetVisible

Shows or hides a widget.

Inputs
(exec)exec
Widgetwidget
Visiblebool
Outputs
(exec)exec

Shows or hides a widget without destroying it. A hidden widget keeps everything — its text, its size, its position, its children — and comes back exactly as it was. Hiding a parent hides everything inside it, so one call on an overlay's Root takes a whole HUD off screen and one more brings it back.

When to use it

Toggles and optional parts: a scoreboard on a key, a warning line that only appears when it matters, a card that is built once and shown when needed. Compare Destroy HUD Overlay, which throws the overlay away so the next show rebuilds it from the layout, and Destroy Widget, which removes one widget for good.

Example

An F5 scoreboard toggle, from an empty project. On Key Pressed with the key F5 and "Scoreboard" as its name in Controls → Show HUD Overlay (scoreboard) → Scale For ScreenFlip Flop: path A → Set Widget Visible (Widget = Root, Visible ticked); path B → Set Widget Visible (Widget = Root, Visible unticked).

Because Show HUD Overlay hands back the same overlay every time, the first press builds the board and every press after it only flips the switch.

Watch out

  • A widget authored hidden in the layout editor stays hidden when you show its parent — its own state is separate, so show it too.
  • Hiding is not removing. A hidden killfeed card still exists and still counts toward the pile; use Auto-Destroy Widget After or Clear Widget Children for cards you are finished with.
  • An empty Widget handle does nothing at all, so a mistyped name in Find Child Widget looks exactly like a toggle that "does not work".
  • Client-side only: the project must be Server + Client, and the node must come before any server action in its chain.

Show HUD Overlay

actionclientaction.hudShowOverlay

Puts a layout on screen as an always-on overlay and gives you its root widget. Creates it once — calling again returns the same overlay. Runs on the player's client (server+client project).

Inputs
(exec)exec
Outputs
(exec)exec
Rootwidget
Settings
LayoutlayoutPickerrequired

Puts one of your layouts on screen as an overlay: drawn on top of the game world, always there, no mouse cursor and no pause. You design the layout in NodeZ's layout editor and attach it to the project; this node loads it on the player's own machine and hands back the Root widget — the handle every other HUD node works from.

The overlay is created once and remembered, keyed on the layout. Run the node again and you get the same overlay back rather than a second copy stacked on top, which is what makes it safe at the top of an event that fires over and over. Nothing takes an overlay down by itself: it survives death and respawn until Destroy HUD Overlay removes it or the player leaves.

When to use it

Anything permanently on screen that you own — a killfeed, a scoreboard, a round timer, a zone warning. An overlay takes no input, so for something the player clicks build a menu layout and drive it from the UI events (On Button Clicked) instead. For repeated pieces *inside* an overlay — one card per kill, one row per player — use Add Widget From Layout: that node makes a fresh copy every time, this one hands back the same overlay every time.

Pins

Layout (property) — one of the layouts attached to this project. Pointing at a layout that is not attached is an error the editor reports before you build.

Root — the top widget of the overlay. Send it to Scale For Screen first, then to Find Child Widget to reach the named widgets inside. It comes back empty if the layout could not be loaded, and every HUD node downstream then quietly does nothing.

Example

A killfeed, from an empty project. Build a layout killfeed whose root holds a container widget named Cards. On the server: On Player DiedBroadcast Client Message named "kill", carrying the killer's Get Player Name in Text 1 and the victim's in Text 3. On the client: On Client Message listening for "kill" → Show HUD Overlay (Layout killfeed) → Scale For ScreenAdd Widget From Layout with Parent set to Find Child Widget of the Root, Name "Cards".

The first kill builds the overlay; every kill after that reuses it and only adds a card.

Watch out

  • This runs on the player's machine, so players must have the mod and the project must be set to Server + Client. On "Server only" the editor blocks the build and says so; on a server-only *install* the server half still runs and the HUD is simply never there, with nothing in the logs to explain it.
  • Run Scale For Screen straight after. Layouts are authored at 1080p and exact sizes are real pixels, so on 1440p or 4K an unscaled overlay shrinks into a corner.
  • Everything from the first server node onward in a chain is handed to the server, and HUD nodes there do nothing. Delay is a server node, so it cannot sit in the middle of a HUD chain — use Auto-Destroy Widget After when you need timed removal.
  • Take an overlay down with Destroy HUD Overlay, not Destroy Widget on the Root. Only the first also forgets the overlay, so a later Show builds it again.

Actions/Items

Attach Existing Item

actionserveraction.attachExistingItem

Attaches an EXISTING item onto a target (scope onto a rifle, wheel onto a car). The matching slot is found automatically. Attached is false when there is no free matching slot. To create a brand-new attachment use "Attach New Item".

Inputs
(exec)exec
Itementity
Attach Toentity
Outputs
(exec)exec
Attachedbool

Seats an item that already exists into a matching attachment slot on a target — a scope onto a rifle, a wheel onto a car, a battery into a flashlight. You do not pick the slot: the engine reads which slot the item belongs in from its own config and finds a free one on the target. The move is server-authoritative, so all clients see the attachment appear.

When to use it

This is the only attach node for an item you already have a wire to. If you want to create a brand-new attachment from a classname, that is Attach New Item (or Attach Item To Item when you are chaining off items other nodes made). If the item belongs in cargo rather than a slot, use Move Item Into Container — a wheel goes in a slot, a jerrycan goes in cargo.

Pins

Attach To — the entity receiving the attachment: a weapon, a vehicle, a piece of clothing. Attached — false when the target has no free slot that matches the item.

Example

Fitting an optic you are holding onto the rifle on your shoulder: On Press Item Action (Item Class ACOGOptic, Prompt Text "Fit to rifle") → Get Attachment In Slot (Entity = the event's Player, Slot Name = "Shoulder") → Is ValidBranch. On True, Attach Existing Item (Item = the event's Item, Attach To = that slung rifle) → Branch on Attached → Send Notification "Optic fitted" or "No free optics slot". On False, Send Notification "Sling a rifle first".

Watch out

  • Attached is false when the matching slot is already occupied or the target simply has no such slot — an item can only ever land in a slot its config names. Branch on it.
  • Both wires must be real entities. Empty hands, a failed search, or an empty Get Player Vehicle all produce empty wires — gate on Is Valid before attaching.
  • Attach To will not take the Target of On Press Interaction or On Hold Interaction. Those hand you a plain world object, and the editor refuses that wire. Send it through As Item first — but that only converts things that really are items, so a car or a building comes back empty. For a vehicle, take an already-entity source such as Get Player Vehicle or the Vehicle from On Player Entered Vehicle.

Attach New Item

actionserveraction.attachItem

Creates a new item and attaches it to a target (a suppressor on a rifle, a battery in a torch...). The attachment must fit a slot the target actually has, or nothing attaches.

Inputs
(exec)exec
Targetentity
Item Classstringoptional
Outputs
(exec)exec
Attachmententity
Settings
Item ClassclassnamePickerrequired

Creates a brand-new item from a classname and seats it in a matching attachment slot on the target, in one step — a battery into a torch, an optic onto a rifle, a wheel onto a car. You never name the slot: the engine reads which slot the new item belongs in from the item's own config and puts it in the first free one. This is the same inventory call vanilla uses when it builds a kitted-out weapon.

An attachment slot is not cargo. A suppressor goes in a slot; a jerrycan goes in a car's cargo grid.

When to use it

Finishing an item you just created: the battery for the flashlight you handed out, the optic on the rifle. When the attachment already exists somewhere and you have a wire to it, use Attach Existing Item instead. Attach Item To Item does the same creation as this node but first checks that the class is not blank and the target is real, and it hands back an item rather than an entity — prefer it when the classname comes from a config that may be empty. For cargo rather than a slot, Spawn Item In Cargo.

Pins

Target — the entity that receives the attachment: a weapon, a vehicle, a piece of clothing, a player.

Item Class — the panel picker, or a wire that overrides it (from Get Config Text or Random Config Text, say).

Attachment — the created item, as an entity. Tag Item and Set Item Lifetime take it directly; the item-typed setters like Set Item Health need As Item in between.

Example

A flashlight that actually lights: On Player ReadyGive Item To Player (Item Class Flashlight) → Attach New Item (Target = the Item output of Give Item, Item Class Battery9V) → Send Notification ("Kit", "Your flashlight is charged").

Wiring Target from Give Item's Item output is what makes it land in *that* flashlight rather than somewhere else in the inventory.

Watch out

  • If the target has no slot that fits, or the fitting slot is taken, nothing attaches and Attachment comes back empty. Check it with Is Valid before using it.
  • This node does not check its own inputs. An empty Target wire — a failed lookup, or Get Player Vehicle for a player on foot — puts an error in the server's script log instead of quietly skipping. Gate it with Is Valid, or use Attach Item To Item, which checks for you.
  • Classnames are case-sensitive: Battery9V, not battery9v.
  • Attaching something to a player fires On Item Attached — including your own attach. A graph that attaches inside that event will trigger itself again.
  • Do not attach gear in the same instant as Teleport Player: the item never reaches the other clients and the player looks unequipped to everyone else. Put a Delay of about 2 s between them and run Resync Player Gear afterwards.

Drop Item To Ground

actionserveraction.dropItemToGround

Takes an item out of whoever/whatever is carrying it and drops it on the ground where they stand. Dropped is false when the item is already on the ground.

Inputs
(exec)exec
Itementity
Outputs
(exec)exec
Droppedbool

Pulls an item out of whatever is carrying it and drops it on the ground. The node walks up the carrying chain to the top — the player wearing the backpack the item sits in, the crate the bag is stored in — and drops the item at that carrier's feet, using the same server-side drop the vanilla skinning action uses. Every client sees it land.

When to use it

Forced disarms, spilling loot, making a player physically let go of something. If the item should cease to exist rather than hit the ground, use Delete Entity. If it should go somewhere specific instead of the floor, use Move Item Into Container. To strip a player of everything at once, Clear Inventory is the bigger hammer.

Pins

Dropped — false when there was nothing to do: the item is already lying on the ground, or the wire was empty.

Example

A safezone that disarms on entry: Player Entered Zone (trader camp, radius 50) → Get Item In Hands (Player) → Drop Item To GroundSend Notification "No weapons in the safezone."

Watch out

  • The item lands at the feet of the top-level carrier, not where the item's immediate container is. An item buried in a pouch inside a worn backpack drops at the player.
  • An empty wire (empty hands, a failed search) is handled quietly — Dropped just comes back false — so it is safe to run without checking first, but branch on Dropped when you need to know it actually happened.

Move Item Into Container

actionserveraction.moveItemToCargo

Moves an existing item into a container's cargo (a crate, a backpack, a vehicle...). Moved is false when it does not fit.

Inputs
(exec)exec
Itementity
Containerentity
Outputs
(exec)exec
Movedbool

Takes an item that already exists — on the ground, in a player's hands, inside another bag — and moves it into a container's cargo space. The move is server-authoritative, the same inventory channel the engine itself uses, so every client sees the item land in its new home. Nothing is created or destroyed: it is the one node for relocating a real item you already have a wire to.

When to use it

Reach for this when the item exists and you want it somewhere specific. If you want to conjure a new item inside a container, that is Spawn Item In Cargo. If the item should sit in an attachment slot (a scope on a rifle, a wheel on a car) rather than in cargo, use Attach Existing Item — cargo and attachment slots are different things and this node only does cargo. To hand an item to a player "anywhere it fits", Give Item To Player creates a new one instead.

Pins

Container — anything with cargo space: a crate, barrel, backpack, tent, or vehicle. It must have room for the item's size. Moved — false when the item did not fit. The item stays where it was.

Example

A deposit box: On Hold Interaction (Object Class WoodenCrate, Prompt Text "Deposit", Hold Seconds 3) → Move Item Into Container, with Item fed by Get Item In Hands on the event's Player and Container fed by As Item on the event's Target → Branch on Moved → Send Notification "Stored" or "No room".

The As Item step is the part people miss. An interaction event hands the crate over as a plain world object, and Container wants an entity, so the editor refuses the wire until you cast it.

Watch out

  • Moved comes back false more often than you expect — a full container, an item too big for the grid. Always branch on it instead of assuming success.
  • Container must be a real entity. World objects — an interaction event's Target, anything out of For Each Object Near — arrive as plain objects and will not wire in at all; run them through As Item first. When the source can also come up empty (a search, Get Player Vehicle, or a cast of something that is not an item), gate on Is Valid as well: running this with an empty Container wire fails at run time.
  • Cargo only. A rifle has attachment slots, not cargo; trying to "move" a suppressor onto it does nothing useful — that is Attach Existing Item's job.

Remove Items Of Type

actionserveraction.removeItemsOfType

Deletes up to How Many items of a type from an entity's inventory (matches subtypes). Removed tells you how many were actually taken.

Inputs
(exec)exec
Containerentity
How Manyint
Item Classstringoptional
Outputs
(exec)exec
Removedint
Settings
Item ClassclassnamePickerrequired

Deletes up to a set number of items of one class from an entity's inventory. It walks the whole inventory tree — hands, pockets, worn clothing and everything inside it, a backpack's cargo, the magazine attached to a rifle — and deletes the first matches it meets, subtypes included. The items are destroyed, not dropped.

Removed reports how many it actually took. That number is the point of the node: it is how you tell "they paid the toll" from "they were one short", in one step, with no separate count.

When to use it

Taking things away: contraband sweeps, an entry fee at an arena, the ingredient half of a craft. To empty someone completely, Clear Inventory is one node. To look before you take, Has Item In Inventory and Count Items In Inventory answer without changing anything, and Find Item In Inventory hands you the item itself if you would rather modify it than delete it.

Pins

Container — whose inventory to search. A player wires straight in; so does a tent, a car, or a crate.

How Many — the ceiling. It stops as soon as it has taken that many.

Item Class — the panel picker, or a wire that overrides it.

Removed — how many were destroyed, 0 to How Many.

Example

A two-can trade you can perform from your hands: On Press Item Action (Item Class TacticalBaconCan, Prompt Text "Trade in") → Remove Items Of Type (Container = the event's Player, Item Class TacticalBaconCan, How Many 2) → Equals (Numbers) (Removed, 2) → Branch → true: Give Item To Player (BandageDressing) and Send Notification ("Trade", "Two cans for a bandage") → false: Send Notification ("Trade", "You need two cans").

The Branch is not decoration. Without it a player with one can loses that can and gets nothing back.

Watch out

  • Deleting a container deletes what is inside it. Removing a backpack takes its whole cargo with it.
  • Subtypes count. Naming a base class removes every variant descended from it, which is occasionally what you want and often a surprise.
  • Worn gear is included, not just pockets — a hat on someone's head is removed like anything else. If only carried items should go, find them yourself with Find Item In Inventory and delete with Delete Entity.
  • Classnames are case-sensitive.
  • Removed can be less than How Many. Branch on it before paying anything out.
  • Sweeping every player with For Each Player hits corpses too — they count as players until they despawn. Gate on Is Player Alive when a body should keep its loot.

Set Container Liquid

actionserveraction.setItemLiquid

Sets what liquid a container holds (only works on liquid containers). This sets the TYPE of liquid — use Set Item Quantity to set how much.

Inputs
(exec)exec
Containeritem
Outputs
(exec)exec
Settings
Liquidselect · Water | Clean Water | Vodka | Beer | Gasoline | Diesel | Disinfectant | Saline | None · default "Water"required

Decides *what* is inside a container: Water, Clean Water, Vodka, Beer, Gasoline, Diesel, Disinfectant, Saline, or None. These are the game's own liquid types, so the item's label and what drinking it does to a player follow automatically.

It does not change *how much* is in there. An empty canteen set to Clean Water is still an empty canteen — pair this node with Set Item Quantity to put something in it. And the amount already inside is not thrown away: setting a half-full canteen to Gasoline gives you half a canteen of gasoline.

When to use it

Filling containers for players: a canteen of clean water at spawn, a canister of fuel as a reward, a purify prompt on a held bottle. To read what is in there, Get Container Liquid returns the same words as text for Text Equals. To top up a vehicle instead of a container, Refuel Vehicle is the node.

Pins

Container — the item to fill, item-typed. Give Item To Player, Find Item On Player and the held-item events wire straight in; entity-shaped sources need As Item between them.

Liquid (panel) — one of the nine types. "None" empties the type without touching the amount.

Example

A canteen of clean water in every spawn kit: On Player ReadyGive Item To Player (Item Class Canteen) → Set Container Liquid (Container = the Item output, Liquid "Clean Water") → Set Item Quantity (Item = the same Item, Mode "Fill To Max") → Send Notification ("Kit", "A full canteen of clean water").

Watch out

  • Water and Clean Water are not the same thing. Plain Water is the unpurified kind that can make a player ill; Clean Water is the safe one. Handing out "Water" as a reward is a slow way to poison your server.
  • Items that cannot hold liquid ignore this node, and an empty item wire is skipped silently.
  • Setting the type never adds any liquid. If the container was empty it stays empty and the player sees nothing change — that is the most common "it did not work".
  • Gasoline and Diesel in a drinking container are perfectly legal as far as the engine is concerned. Nothing stops a player drinking them.

Set Food Stage

actionserveraction.setFoodStage

Cooks or spoils a food item to a chosen stage (only works on food).

Inputs
(exec)exec
Fooditem
Outputs
(exec)exec
Settings
Stageselect · Raw | Baked | Boiled | Dried | Burned | Rotten · default "Raw"required

Cooks or spoils a piece of food instantly, jumping it to the stage you pick: Raw, Baked, Boiled, Dried, Burned or Rotten. It is the same state change a fireplace produces over several minutes, applied in one node — the item's name, its look and what it does to whoever eats it all follow the new stage.

Only food responds. Anything else wired in is skipped silently, so a graph that runs over mixed inventory does not need to filter first.

When to use it

Food as a reward or a punishment: a hot cooked meal at spawn, a stash that rots while nobody visits, a "campfire in a box" prompt. To read the current stage use Get Food Stage, which gives the same words back as text — compare it with Text Equals. Cooking is not the same as heat: Set Item Temperature makes a meal warm without cooking it, and this node cooks without making it warm.

Pins

Food — the item to cook, item-typed. The held-item events, Give Item To Player and Find Item On Player fit directly; entity-shaped sources go through As Item first.

Example

Roasting an apple by hand: On Hold Item Action (Item Class Apple, Prompt Text "Roast", Hold Seconds 4) → Set Food Stage (Food = the event's Item, Stage "Baked") → Set Item Temperature (Item = the same Item, Degrees 60) → Send Notification ("Roasted", "It smells good").

Stage first, temperature second: the first makes it cooked, the second makes it hot. Without the second node the player eats a baked apple straight from the fridge.

Watch out

  • Only food with cooking stages changes. Sealed food and drinks have nothing to move through, so the node does nothing to them.
  • Rotten is a real stage, not a cosmetic one — food set to Rotten makes people sick when they eat it. Say so in a notification if you use it as a joke.
  • The stage does not change the quantity. A half-eaten steak stays half-eaten; use Set Item Quantity for that.
  • The item wire is skipped when empty, so a lookup that found nothing fails silently. Check with Is Valid when it matters.

Set Item Health

actionserveraction.setItemHealth

Sets an item's health / condition. Leave Zone blank for the whole item.

Inputs
(exec)exec
Itemitem
Valuefloat
Outputs
(exec)exec
Settings
Modeselect · Set Value | Set Percent (0-1) | Repair Full · default "Set Value"required
Zone (blank = whole item)text

Sets an item's condition — the Pristine / Worn / Damaged / Badly damaged / Ruined ladder players see in their inventory. Three modes decide what the Value pin means. Set Value writes raw health points, whose maximum comes from the item's own config. Set Percent (0-1) writes a fraction, 1 being perfect and 0 ruined. Repair Full puts it back to new and ignores Value altogether.

Percent is the mode to reach for. Raw values only make sense once you know that item's maximum, and the same "1" means pristine in one mode and nearly destroyed in the other.

When to use it

Handing out gear in a deliberate state: a worn rifle as a low-tier reward, a pristine one as a high-tier one, a repair bench that restores what a player is carrying. Repair Entity and Damage Entity work on anything at all — vehicles, creatures, world objects — while this node is the item-shaped one, with modes and a zone. To read the current condition, Get Item Health gives you both the raw number and the 0-1 percentage.

Pins

Item — item-typed. Outputs from Give Item To Player, Find Item On Player and the held-item events fit straight in; Get Item In Hands, Find Item In Inventory and other entity-shaped sources go through As Item first.

Value — health points in Set Value, a 0-1 fraction in Set Percent, unused in Repair Full.

Zone (panel) — a named damage zone instead of the whole item. Leave it blank unless you know the item has zones; vehicles do, most hand-held items do not.

Example

A rifle service on login: On Player ReadyFind Item On Player (Item Class M4A1) → Branch on Is Valid of that item → true: Set Item Health (Item = the found rifle, Mode "Repair Full") → Send Notification ("Armoury", "Your rifle has been serviced").

The Branch is doing real work here, because this node does not check its own Item pin.

Watch out

  • Unlike most item nodes, an empty Item wire is not skipped — it puts an error in the server's script log. Gate uncertain lookups with Is Valid as in the example.
  • The Value pin changes meaning with the mode. Switching to Set Percent and leaving 100 in the box, or to Set Value and typing 1, both produce a surprise.
  • Zone names are exact and case-sensitive, and a zone the item does not have does nothing at all — no error, no change.
  • Repair Full ignores Value entirely.
  • Ruining an item a player is wearing does what ruining always does: it stops protecting them. That is a fine punishment, but say so in a notification or it reads as a bug.

Set Item Lifetime

actionserveraction.setItemLifetime

Sets how long the cleanup system leaves a dropped item in the world before it may despawn.

Inputs
(exec)exec
Itementity
Secondsfloat
Outputs
(exec)exec

Sets the despawn clock on an item lying in the world. DayZ's cleanup system gives every dropped item a lifetime and removes it when the countdown runs out; this node writes both that item's full lifetime and the time it has left, so the clock restarts from the number you give.

Only items in the world are on that clock. Something in a player's inventory is not counting down at all.

When to use it

Event loot that should tidy itself up, so an airdrop or a reward pile does not sit there until the next restart. It is the natural partner of Spawn Item, which creates items with no cleanup timer at all — a lifetime here is how you hand one back. To read the remaining time, Get Item Lifetime gives Seconds Left and Max Seconds. To remove something immediately instead of eventually, Delete Entity or Delete Items In Radius.

Pins

Item — the item, as an entity. Both item and entity wires fit: the Item output of Spawn Item, of Spawn Item In Cargo, or anything found by Find Item In Inventory.

Seconds — the new lifetime. 3600 is an hour, 86400 a day.

Example

An event drop that clears itself after ten minutes: On Player DiedSpawn Item (Item Class Mag_STANAG_30Rnd, Position from Get Player Position on the Victim) → Set Item Lifetime (Item = the Item output, Seconds 600) → Tag Item ("drop").

Watch out

  • A short lifetime on something a player is expected to walk to is a trap. Ten minutes is generous for a body drop and mean for a hidden stash.
  • Picking the item up and dropping it again is up to the game's own rules from then on; this node writes the clock once, it does not keep enforcing your number.
  • The item wire is skipped when empty, so a spawn that failed on a bad classname leaves nothing to time.
  • Cleanup is not instant. The system sweeps periodically, so an item can outlive its number by a little.

Set Item Quantity

actionserveraction.setItemQuantity

Changes an item's quantity (rounds in a magazine, litres in a bottle, etc.).

Inputs
(exec)exec
Itemitem
Amountfloat
Outputs
(exec)exec
Settings
Modeselect · Set | Add | Fill To Max · default "Set"required

Sets the number an item carries — the stack size on rags, the fill level in a canteen or a fuel canister, the charge on a battery. It is the same quantity the game itself changes when a player drinks or a stack is split, so the new value shows up on their screen straight away.

Three modes. Set writes the number you give. Add adds it to what is already there. Fill To Max tops the item up to its own capacity and ignores the Amount pin entirely — reach for that instead of typing a big number and hoping.

When to use it

Whenever an item should arrive part-used or full: a half-empty canteen at spawn, a full canister as a reward, a stack of four rags. For rounds in a magazine prefer Set Magazine Ammo, which talks to the magazine's own ammo count. To see the current value and the ceiling, use Get Item Quantity — its Max Quantity output tells you what Fill To Max would do.

Pins

Item — the item to change, item-typed. Wires from Give Item To Player, Find Item On Player and the held-item events fit directly; entity-shaped sources (Get Item In Hands, Find Item In Inventory, the Item output of Spawn Item In Cargo) need As Item in between.

Amount — in the item's own units, whatever the item counts in. Ignored in Fill To Max mode.

Example

A spring you can drink from by hand: On Hold Item Action (Item Class Canteen, Prompt Text "Fill from spring", Hold Seconds 3) → Set Container Liquid (Container = the event's Item, Liquid "Clean Water") → Set Item Quantity (Item = the same Item, Mode "Fill To Max") → Send Notification ("Canteen", "Filled with clean water").

Liquid type and amount are two different things: the first node decides *what* is in the canteen, this one decides *how much*.

Watch out

  • Fill To Max ignores Amount. Changing the mode without noticing is the usual reason a carefully typed number does nothing.
  • Items with no quantity — a rifle, a helmet — ignore this node completely. Get Item Quantity reporting a Max Quantity of 0 is the tell.
  • An empty Item wire is skipped silently, so a lookup that found nothing simply does not happen. Check with Is Valid when the difference matters.
  • Do not wire Random Number into Amount *and* into the notification that announces it: a volatile value re-rolls at every use, so the player is told one number and given another. Store the roll once with Set Player Number and read it back with Get Player Number.

Set Item Temperature

actionserveraction.setItemTemperature

Sets an item's temperature (e.g. heat a meal, freeze meat). This is a one-time set — the environment slowly pulls it back toward the surrounding temperature.

Inputs
(exec)exec
Itemitem
Degrees (°C)float
Outputs
(exec)exec

Sets how hot or cold an item is, in degrees Celsius. It is a one-time write, not a setting: from that moment the world starts pulling the item back toward the temperature around it, so a steak you heat to 80 is merely warm a few minutes later and cold by nightfall.

Heat is not cooking. A raw steak at 80 degrees is a hot raw steak — Set Food Stage is what makes it baked.

When to use it

Warm rewards and cold punishments: a hot meal handed out at spawn, a frozen stash, a meal that arrives with the heat already in it so the player gets the benefit of eating it warm. To read the current value, Get Item Temperature.

Pins

Item — item-typed. Give Item To Player, Find Item On Player and the held-item events fit directly; Get Item In Hands and other entity-shaped sources go through As Item first.

Degrees (°C) — the temperature to write.

Example

Breakfast in the spawn kit: On Player ReadyGive Item To Player (Item Class TacticalBaconCan) → Set Item Temperature (Item = the Item output, Degrees 45) → Send Notification ("Kit", "Hot breakfast, eat it while it lasts").

Watch out

  • The value drifts. Anything you set here is temporary by design, so it is worth doing at the moment the player receives the item rather than minutes earlier.
  • Heating does not cook and cooling does not spoil. Use Set Food Stage for those.
  • An empty Item wire is skipped silently, so a lookup that found nothing simply does nothing.
  • Items that have no use for temperature accept the value and ignore it in play.

Set Item Wetness

actionserveraction.setItemWetness

Sets how wet an item is (0 = bone dry, 1 = soaked). A one-time set — weather and body heat change it again over time. Great for instant-dry rewards.

Inputs
(exec)exec
Itemitem
Wetness (0-1)float
Outputs
(exec)exec

Sets how wet an item is, from 0 (bone dry) to 1 (soaked). Wetness is what makes clothing stop keeping a player warm after rain or a swim, so drying someone's gear is a real, felt reward — and soaking it is a real punishment.

Like temperature, this is a one-time write. Rain, water and body heat keep changing it afterwards; the node just moves the number now.

When to use it

Instant-dry rewards at a shelter or a base, a soaking as the cost of some event, gear handed out dry regardless of the weather. To read the current value, Get Item Wetness. To warm a player up rather than dry them, Set Item Temperature on what they carry, or the player's own heat as read by Get Heat Comfort.

Pins

Item — item-typed. The held-item events, Give Item To Player and Find Item On Player fit directly; entity-shaped sources such as the Item of For Each Item In Inventory need As Item in between.

Wetness (0-1) — 0 dry, 1 soaked. The panel spinner keeps you inside that range; a wired number does not check itself, so run config values through Clamp Number (Min 0, Max 1).

Example

Drying off at a campfire: On Hold Interaction (Object Class Fireplace, Prompt Text "Dry your gear", Hold Seconds 6) → For Each Item In Inventory (Container = the event's Player) → Body: As Item on the loop's Item → Set Item Wetness (Wetness 0) → Completed: Send Notification ("Dry", "Your gear is dry again").

Everything a player wears or carries passes through that loop, nested bags included, so one wiring dries the whole kit.

Watch out

  • The loop above includes items that were never wet. Setting them to 0 is harmless, which is why no filter is needed.
  • Wetness comes straight back in rain. A drying spot under open sky feels broken to players — put the prompt on something sheltered, or pair it with a notification that explains the weather is winning.
  • An empty Item wire is skipped silently.
  • Wiring a number from a config without clamping can push wetness outside 0-1. Clamp Number costs one node.

Set Magazine Ammo

actionserveraction.setMagazineAmmo

Sets how many rounds are in a magazine (only works on magazines).

Inputs
(exec)exec
Magazineitem
Roundsint
Outputs
(exec)exec
Settings
Modeselect · Set Count | Fill To Max · default "Set Count"required

Sets how many rounds are in a magazine. It goes through the magazine's own server-side ammo call, the one vanilla uses when a magazine is filled or emptied, so every client sees the new count and the weapon behaves accordingly. Set Count writes the number you give; Fill To Max loads it to capacity and ignores the Rounds pin.

Only magazine items respond. Point it at a rifle, a can of beans or an empty wire and it quietly does nothing.

When to use it

Handing out ammunition in a deliberate state: a half-loaded starting magazine, full spares as a kill reward, an empty magazine that has to be filled by hand. Give Weapon already loads and chambers the gun it creates, so use this node for the *spare* magazines rather than fighting that one. To read a magazine, Get Magazine Ammo gives both the current rounds and the maximum.

Pins

Magazine — the magazine item, item-typed. The Item output of Give Item To Player and Find Item On Player fit directly; entity-shaped sources such as Spawn Item In Cargo or Get Item In Hands need As Item first.

Rounds — the count to write. Ignored in Fill To Max mode.

Example

A spawn kit with one half-loaded magazine: On Player ReadyGive Item To Player (Item Class Mag_STANAG_30Rnd) → Set Magazine Ammo (Magazine = the Item output, Mode "Set Count", Rounds 15) → Send Notification ("Kit", "One magazine, half loaded").

Give Item hands back the exact magazine it created, which is what keeps the count on *that* one rather than on some other magazine the player was already carrying.

Watch out

  • Anything that is not a magazine is skipped in silence — there is no warning that you pointed it at the wrong item.
  • A weapon with a built-in magazine, like the Mosin9130, has no magazine item to aim at. Fill those by other means.
  • Fill To Max ignores Rounds. Ask Get Magazine Ammo for Max Rounds when you want a fraction of capacity rather than a fixed number.
  • Classnames are case-sensitive when you look a magazine up: Mag_STANAG_30Rnd, not MAG_STANAG_30RND.
  • Find Item On Player returns the first match, so loading "the magazine" twice in a row loads the same one twice and leaves the spare empty.

Spawn Item In Cargo

actionserveraction.spawnItemInCargo

Creates an item inside a container's cargo (a tent, backpack, crate, or barrel).

Inputs
(exec)exec
Containerentity
Item Classstringoptional
Outputs
(exec)exec
Itementity
Settings
Item ClassclassnamePickerrequired

Creates a new item straight inside a container's cargo — the grid you see when you open a tent, a barrel, a sea chest, a backpack or a car boot. The item is born in there; nothing is dropped on the ground first and nothing has to be moved.

Strictly cargo, and that is the difference worth knowing: Put Item Into Item asks the container's inventory for any free spot, attachment slots included, while this node places into the cargo grid only.

When to use it

Stocking containers — event crates, a trader's stash, a resupply barrel, loot in a car you just spawned. For loose loot on the ground use Spawn Item, for a player's own inventory Give Item To Player, and to move an item that already exists Move Item Into Container.

Pins

Container — the entity being filled. A container you spawned, a vehicle from Get Player Vehicle, or a world object passed through As Item.

Item Class — the panel picker, or a wire that overrides it. Wiring it from Random Config Text gives you a crate whose contents a server owner can retune without opening the editor.

Item — the created item, as an entity. Tag Item and Set Item Lifetime accept it directly; the item-typed setters (Set Item Quantity, Set Magazine Ammo) need As Item in between.

Example

A sea chest that restocks when searched: On Hold Interaction (Object Class SeaChest, Prompt Text "Search", Hold Seconds 5) → As Item on the Target → Spawn Item In Cargo (Container = that item, Item Class Mag_STANAG_30Rnd) → As Item on the Item output → Set Magazine Ammo (Mode "Set Count", Rounds 10) → Tag Item ("restock") on the Item.

Two conversions and one tag. As Item bridges the world object into the Container pin and the new entity into the magazine setter; the tag is what later lets a cleanup graph tell your restock from a magazine a player left behind.

Watch out

  • Nothing is created when the cargo is full or the item does not fit the grid, and the Item output comes back empty — check it with Is Valid before wiring it onward.
  • The Container pin is not checked. An empty wire logs an error in the server's script log rather than skipping quietly, so gate uncertain sources (As Item, Get Player Vehicle) with Is Valid first.
  • Classnames are case-sensitive: Mag_STANAG_30Rnd, not mag_stanag_30rnd. A wrong-case class creates nothing and says nothing.
  • The item you create is indistinguishable from an identical one a player dropped in. If any later graph must recognise your stock, Tag Item it now and read it back with Get Item Tag.
  • A config list entry is one string, so "one item per line" is all you get for free. Pack extras into the line ("Mag_STANAG_30Rnd,2") and unpack with Get Text Part.

Actions/Networking

Broadcast Client Message

actionserveraction.broadcastClientMessage

Sends a named message to every player's client — handle it with On Client Message (e.g. to update a HUD). Requires players to have the mod (server+client project).

Inputs
(exec)exec
Text 1stringoptional
Text 2stringoptional
Text 3stringoptional
Number 1floatoptional
Number 2floatoptional
On / Offbooloptional
Outputs
(exec)exec
Settings
Messagetext · default "message"required

Sends a named signal from the server to every connected player's game, where On Client Message with the same name picks it up. This is the bridge between the two halves of a mod: the server decides something happened, and every client is told so it can draw it.

The payload is a fixed envelope — three texts, two numbers and one on/off flag — so sender and receiver never have to agree on a custom format. You fill only the slots you need and leave the rest blank. Under the hood the node loops over everyone currently on the server who has a live connection and sends each of them one guaranteed message; players still connecting, or without a network identity yet, are skipped rather than erroring.

When to use it

Anything every player should see at once that plain text cannot carry: a killfeed row, a round timer, a scoreboard refresh, an event banner. When all you want is words on screen, Broadcast Notification and Broadcast Chat Message are simpler and work on a server-only mod. Reach for this node when the client has to *build* something — a HUD widget, a counter, a coloured row — from the values you send. For one player instead of everyone, use Send Client Message.

Pins

Message (the panel field) — the name that decides which On Client Message wakes up. It is matched as exact text, so "killfeed" and "KillFeed" are two different messages.

Text 1-3 / Number 1-2 / On / Off — the payload slots. Each can be typed into the node or wired. Unwired slots arrive as empty text, 0, and off. Decide what each slot means and keep sender and receiver in step: slot order is the only contract.

Example

A killfeed every player can see: On Player DiedBroadcast Client Message with Message kill, Get Player Name (Killer) into Text 1, Get Player Name (Victim) into Text 2, Get Item In Hands (Killer) → Get Display Name into Text 3, and Was Killed By Headshot (Victim) into On / Off.

On the client side a separate graph starts with On Client Message (Message kill) → Show HUD OverlayAdd Widget From LayoutScale For ScreenSet Text built from the three texts with Join Text, and a Branch on the On / Off pin that adds a headshot marker. The server decides, the client draws.

Watch out

  • Both halves only exist in a Server + Client project, and every player must

have the mod installed. On a server-only install the broadcast has nobody listening and the HUD is simply absent — with no error anywhere.

  • The message name is exact text. A typo on either side means silence: the

message is sent, no handler matches, nothing happens. There is no warning for an unhandled name.

  • Nothing is sent to a player who has not finished connecting. If a message

matters at join time, send it from On Player Ready with Send Client Message rather than assuming a broadcast caught them.

that broadcasts. Everything hud* runs on the player's own machine and cannot be reached from a server-side chain.

  • Broadcasting inside a per-hit or per-kill event on a busy server means a lot

of traffic. Send state changes, not a message per frame.

Send Client Message

actionserveraction.sendClientMessage

Sends a named message to one player's client — handle it with On Client Message. Requires that player to have the mod (server+client project).

Inputs
(exec)exec
Playerplayer
Text 1stringoptional
Text 2stringoptional
Text 3stringoptional
Number 1floatoptional
Number 2floatoptional
On / Offbooloptional
Outputs
(exec)exec
Settings
Messagetext · default "message"required

Sends a named signal from the server to one player's game, where On Client Message with the same name picks it up. It is the private version of Broadcast Client Message — same envelope, one recipient.

The payload is fixed: three texts, two numbers and one on/off flag. Fill the slots you need and leave the rest blank. The node checks the player before it sends: an empty Player pin, or one whose connection is not live yet, is skipped silently rather than erroring, so a failed lookup upstream just means no message.

When to use it

Anything meant for one player's screen that plain words cannot carry: a personal score panel, a quest tracker, a stamina bar, a warning ring that only they see. For just a line of text, Send Notification and Send Chat Message are simpler and work on a server-only mod. When everyone should get the same signal, use Broadcast Client Message — one broadcast is far cheaper than looping For Each Player around this node.

Pins

Player — who receives it. Required, and it must be a live player: nothing is sent for an empty pin.

Message (the panel field) — the name that decides which On Client Message wakes up on that client. Matched as exact text, so "score" and "Score" are two different messages.

Text 1-3 / Number 1-2 / On / Off — the payload slots. Typed in or wired; unwired slots arrive as empty text, 0, and off. The order is the whole contract between sender and receiver, so decide what each slot means and stick to it.

Example

A personal bounty panel: On Creature KilledIs Valid (Killer) → BranchAdd To Saved Player Number ("bounty" + 5) on the Killer → Send Client Message (Player = Killer, Message bounty) with Get Saved Player Number ("bounty") wired into Number 1.

The other half is its own graph: On Client Message (Message bounty) → Show HUD OverlayAdd Widget From LayoutScale For ScreenSet Text fed by Join Text ("Bounty: " + Number 1) → Fit Widget To TextAuto-Destroy Widget After (6 seconds), so the panel appears, sizes itself, and clears itself away.

Watch out

  • Both halves only exist in a Server + Client project, and that player must

have the mod installed. Against a vanilla client the send is a no-op and no error is raised anywhere.

  • The message name is exact text on both sides. A mismatch means the message

arrives and no handler matches — silence, with nothing to debug.

  • Nothing is sent while the player is still connecting. On join, send from

On Player Ready rather than On Player Connected, which can fire while the client is still on the loading screen.

those nodes read what is laid out right now, so the order in the receiving chain matters.

  • After a Delay only the carried player survives, so re-derive the

values you want to send instead of reading a global that another player's event may have overwritten during the wait.

Actions/Player

Add Shock

actionserveraction.addPlayerShock

Changes a player's shock. Negative deals shock (toward unconscious); positive restores it. Enough negative shock knocks them out. -25 is a firm hit; -100+ likely drops them.

Inputs
(exec)exec
Playerplayer
Amountfloat
Outputs
(exec)exec

Changes a player's shock — the knock-out meter. Negative amounts push them toward unconsciousness; positive amounts help them recover. As a feel for the scale: -25 is a firm hit, and -100 or more will likely drop them on the spot.

When to use it

Graded, stackable stun effects: a gas zone that wears players down tick by tick, a taser that usually — but not always — drops its target. When you want a guaranteed instant knockout, use Knock Out Player; for a guaranteed instant wake-up, Wake Up Player. Read the meter with Get Player Shock.

Example

A disorienting field: While Player In Zone ticking every 10 s → Add Shock -35 — an unprotected player staying put drops after the third tick, which gives them two warnings' worth of time to leave.

Apply Bleeding

actionserveraction.applyBleeding

Opens a bleeding wound on a player. The counterpart to Stop All Bleeding. Started is false when that spot is already bleeding. Bandaging or Stop All Bleeding closes it.

Inputs
(exec)exec
Playerplayer
Outputs
(exec)exec
Startedbool
Settings
Whereselect · Head | Neck | Chest | Stomach | Left Arm | Right Arm | Left Leg | Right Leg · default "Left Arm"required

Opens a real bleeding wound on the player at the body zone you pick — the same wound system a knife slash uses. The player sees the blood indicator, their blood drains over time, and a bandage or rags treat it exactly like any other cut. The Started output tells you whether a new wound actually opened.

When to use it

Environmental harm that should feel physical rather than abstract: gas exposure, anomaly damage, trap teeth. Compared with an instant hit from Set Player Health or Damage Entity, a bleed drains gradually and the player can fight back with a bandage — which makes it the right pressure for "get out or gear up" zones. Its counterpart is Stop All Bleeding; check state with Is Player Bleeding or Get Bleeding Wounds.

Pins

Started — true when a fresh wound opened; false when that body zone is already bleeding (a repeat tick does not stack a second wound on the same spot).

Example

A gas zone that punishes anyone without a mask: While Player In Zone over a 100 m zone, ticking every 5 seconds → Get Attachment In Slot (slot "Mask") → Get Entity TypeText Equals against "GasMask" → Branch; on the false branch, Apply BleedingSend Notification "Put a gas mask on!". The tick is what gives the zone teeth: every 5 seconds it reopens the wound the player just bandaged, so staying costs rags.

The same idea goes config-driven by reading the zone and the accepted mask list with Get Setting instead of typing them into the panel, so the zone can be retuned without reopening the editor. For the enter/stay/leave skeleton around it, start from the Toxic zone template and swap its stay-tick notification for Apply Bleeding.

Watch out

  • One wound per zone: while a spot is still bleeding, running this again there does nothing and Started reads false. Pick a different zone in the panel, or let the tick reopen it after the player bandages.
  • Players can and will bandage. For a persistent zone effect, keep applying on every While Player In Zone tick rather than once on entry.
  • If you gate on worn gear: Get Attachment In Slot reads what is worn in the slot — a gas mask in a pocket protects nobody — and the compare is case-sensitive ("GasMask", not "Gasmask").

Clear Inventory

actionserveraction.clearInventory

Removes everything a player is wearing and carrying. Use it before giving a fresh loadout so the new items equip into empty slots.

Inputs
(exec)exec
Playerplayer
Outputs
(exec)exec

Strips a player bare: every piece of worn clothing, whatever is in their hands, and everything in cargo — all of it removed in one call. The items are deleted, not dropped; nothing lands on the ground.

When to use it

The step before a loadout. New gear equips into whatever slots are free, so giving a kit over the default fresh-spawn clothes leaves items landing in odd places — clear first and everything the kit gives goes exactly where it should. Also arena resets and confiscation. To remove only specific things, use Remove Items Of Type instead.

Example

A spawn kit: On Player ReadyDelay 3 s → Clear Inventory → a welcome Send NotificationTeleport Player to the arena pad → a second Delay 2 s → Give Item To Player "TShirt_Black" → Give Item To Player "CargoPants_Black" → Give Weapon "M4A1" loaded with "Mag_STANAG_30Rnd" → Resync Player Gear. That second delay is the one people leave out: handing gear over in the same instant you move someone leaves every other client looking at a naked body, and the resync on the end is the backstop. Each Delay carries the player to its Then side, so every node after one takes its Player from the delay rather than from the event. Wire the same chain under On Player Respawned so a death puts the player back in the same kit.

A reusable kit routine opens the same way, one node longer: Clear InventoryHeal Player Fully before the loadout — gear and body both wiped, so it does not matter what shape the player arrived in.

Watch out

  • There is no undo and no drop — everything the player owned is gone for good. Wire it only where losing gear is the point.
  • Wait a beat (about 3 s) after the spawn event before clearing and re-gearing. Give the fresh character that moment to finish setting up before you strip and re-dress them, and keep the give-plus-teleport off the same instant — see Resync Player Gear for what happens otherwise.

Cure All Diseases

actionserveraction.cureAllDiseases

Removes every disease and infection from a player.

Inputs
(exec)exec
Playerplayer
Outputs
(exec)exec

Removes every disease and infection from a player in one go — everything Give Disease can apply, plus anything they caught naturally from bad water or a dirty wound.

When to use it

A medic NPC, a hospital zone, or an admin heal. It is already part of Heal Player Fully, so only wire it separately when you want to cure without healing everything else. Check whether there is anything to cure with Has Disease.

Example

A field hospital: Player Entered Zone at the medical camp → Cure All DiseasesSend Notification "You feel the fever break."

Give Disease

actionserveraction.givePlayerDisease

Infects a player with a disease agent. A low strength may be fought off before symptoms show — use 100 or more for a guaranteed illness.

Inputs
(exec)exec
Playerplayer
Strengthfloat
Outputs
(exec)exec
Settings
Diseaseselect · Cholera | Influenza | Salmonella | Brain Disease | Food Poisoning | Chemical Poisoning | Wound Infection | Nerve Agent | Heavy Metal Poisoning · default "Influenza"required

Infects a player with one of the game's real disease agents — cholera, influenza, salmonella, brain disease, food poisoning, chemical poisoning, wound infection, nerve agent, or heavy metal poisoning. From there the vanilla illness runs its own course: incubation, symptoms, progression, and the usual cures.

Strength is how big a dose lands. The immune system fights small doses off before symptoms ever show; 100 or more makes the illness stick.

When to use it

Contaminated water sources, cursed loot, chemical zones, or punishments with a slow burn. Check for an active illness with Has Disease; clear everything with Cure All Diseases (which Heal Player Fully also includes).

Example

A leaking chemical plant: While Player In Zone ticking every 15 s over the site → Branch on a worn-mask check (Get Attachment In Slot, slot "Mask") → on false, Give Disease set to Chemical Poisoning at strength 150 → Send Notification "Your lungs burn."

Watch out

  • These are the vanilla diseases, so vanilla medicine cures them — charcoal, antibiotics, and friends work exactly as players expect. You cannot make an incurable variant this way; for relentless zone pressure, keep re-applying on a tick.
  • Strength below roughly 100 is a gamble: a healthy player may shrug it off without a single symptom. That can be exactly the flavour you want, or a bug report waiting to happen.

Give Energy

actionserveraction.giveEnergy

Adds to a player's energy (food). Use a negative amount to remove it. A player's energy maxes out around 5000.

Inputs
(exec)exec
Playerplayer
Amountfloat
Outputs
(exec)exec

Adds to a player's energy — the food stat eating fills. A negative amount removes it instead. Energy tops out around 5000, and this node adds to the current value rather than setting it.

When to use it

Spawn kits, quest rewards, or drains (a harsh-winter mod ticking energy away). Its twin for hydration is Give Water; Heal Player Fully fills both to maximum. Read the current level with Get Player Energy.

Example

Comfortable spawns: On Player Ready (On Player Ready) → Give Water 2000 → Give Energy 2000 — fresh characters start fed and watered.

Give Water

actionserveraction.giveWater

Adds to a player's water (hydration). Use a negative amount to remove it. A player's water maxes out around 5000.

Inputs
(exec)exec
Playerplayer
Amountfloat
Outputs
(exec)exec

Adds to a player's water — the hydration stat drinking fills. A negative amount removes it instead. Water tops out around 5000, and this node adds to the current value rather than setting it.

When to use it

Spawn kits, rewards, or hardship effects (a desert zone draining water on a tick). Its twin for food is Give Energy; Heal Player Fully fills both to maximum. Read the current level with Get Player Water.

Example

Comfortable spawns: On Player Ready (On Player Ready) → Give Water 2000 → Give Energy 2000 — fresh characters start fed and watered instead of hunting a well.

Give Weapon

actionserveraction.giveWeapon

Puts a weapon in the player's hands, loaded and ready to fire, plus optional attachments. The magazine is attached and a round is chambered, so the player does not have to rack it first. Leave slots blank (or wire empty text) to skip them. Weapon is the created item — empty if the classname was wrong.

Inputs
(exec)exec
Playerplayer
Weapon Classstringoptional
Magazine (loaded)stringoptional
Attachmentstringoptional
Attachmentstringoptional
Outputs
(exec)exec
Weaponitem
Settings
Weapon ClassclassnamePickerrequired
Magazine (loaded)classnamePicker
AttachmentclassnamePicker
AttachmentclassnamePicker

One node, one finished weapon: the gun is created directly in the player's hands, the magazine is attached, a round is chambered, and up to two attachments are bolted on. These are the same calls vanilla's starting-loadout spawner uses. Done by hand with Give Item To Player, each of those goes wrong separately — the gun lands in the backpack, the magazine sits loose beside it, and the player still has to rack the bolt before the weapon fires. This node fixes all three at once.

Every slot is forgiving about blanks. An empty Weapon Class means "no weapon this time" and the whole node quietly skips — deliberate, so a config-driven kit can leave the weapon out. An empty magazine or attachment slot is simply skipped. And if the weapon classname turns out not to be an actual firearm, the "magazine" is attached like any other attachment instead of loaded — odd classnames stay safe.

When to use it

Any time a player should receive a working gun: spawn kits, kill rewards, arena loadouts. For a weapon placed in the world rather than in hands, use Spawn Item. For adding more attachments than the two slots here, chain Attach Item To Item against the Weapon output.

Pins

Weapon Class / Magazine (loaded) / Attachment — each can come from the panel's classname picker or a wired text pin; a wire overrides the panel. This is what makes config-driven kits work: wire classnames straight out of your config.

Weapon — the created item. Feed it to Set Quick Bar Slot or Attach Item To Item. It comes back empty when the classname was wrong — check with Is Valid.

Example

Team loadouts with literal classnames: On Player ReadyClear Inventory → team clothes via Give Item To PlayerGive Weapon. The blue team's node holds AKM, Mag_AKM_30Rnd and AK_WoodBttstck; the red team's holds M4A1, Mag_STANAG_30Rnd, M4_OEBttstck and M4_RISHndgrd. One node per side, and each fighter spawns with the bolt already racked.

The config-driven form drops the literals: read the weapon and ammo names from your config with Get Setting (keys weapon and ammo) and wire them into the Weapon Class and Magazine pins — one graph then serves any number of kits — with extra attachments added afterwards via Attach Item To Item against the Weapon output.

Watch out

  • Classnames are case-sensitive: Aug, not AUG; Mag_STANAG_30Rnd exactly. A wrong-case name produces nothing, the Weapon output comes back empty, and no error is shown.
  • Giving gear in the same instant as a teleport desyncs — the player looks naked to everyone else. Wait about 2 s (Delay) after Teleport Player before giving, and run Resync Player Gear after the last item as a backstop.
  • The gun is created in the hands, so make sure they are free — run Clear Inventory first. When in doubt, check the Weapon output with Is Valid.
  • Wiring the Weapon output into Set Quick Bar Slot straight away can leave the slot empty — the client needs a couple of seconds to receive the new item first. Put a Delay of about 2 s between the give and the quick-bar assignment.

Heal Player Fully

actionserveraction.healPlayerFully

Restores a player completely: full health and blood, bleeding stopped, diseases cured, hunger and thirst filled, legs healed. Handy for a spawn kit, an admin heal, or an arena round reset.

Inputs
(exec)exec
Playerplayer
Outputs
(exec)exec

The full reset button. One run restores everything at once: health and blood to maximum, shock refilled, every bleeding wound closed, every disease removed, hunger and thirst filled, broken legs healed. It is the combined effect of the individual medical nodes, in a single step.

When to use it

Spawn kits, arena round resets, an admin heal, a medic NPC. When you only want to touch one thing, reach for the specific node instead: Set Player Health, Set Player Blood, Stop All Bleeding, Cure All Diseases, Give Water and Give Energy, Set Broken Legs.

Example

An arena kit routine opens with exactly this pattern: On Player RespawnedDelay 3 s → Clear InventoryHeal Player Fully, and only then Teleport Player into the arena and the loadout. Clearing takes away what the player carried, healing takes away the state they carried in their body — so every fighter starts identical, whatever they arrived in.

Watch out

  • Stamina is the one stat it leaves alone — add Set Player Stamina if you want the bar full too. It also does not release a restrained player.
  • Because it refills shock, it wakes an unconscious player as a side effect. If that is all you wanted, Wake Up Player is the targeted tool.

Kill Player

actionserveraction.killPlayer

Instantly kills a player.

Inputs
(exec)exec
Playerplayer
Outputs
(exec)exec

Drops the player's health to zero on the spot. It is a normal death in every other way: the death screen shows, the body stays where it fell, and On Player Died fires.

When to use it

Rule enforcement — leaving the arena, entering a forbidden area, an admin's last resort. For drama without a corpse, Knock Out Player puts them down temporarily instead. For damage they might survive or treat, use Set Player Health or Apply Bleeding.

Example

The classic arena boundary: Every N Seconds (every 1 s) → For Each Player; each player outside the arena radius and still alive ticks a per-player grace counter up (Add To Player Number); a Branch warns while grace remains and runs Kill Player once it is spent, then resets the counter. The counter is what keeps it fair — a player who clips a metre over the line gets a few seconds of warnings, not an instant death.

Watch out

  • On Player Died fires, but the Killer output is empty — this is a health set, not an attack, so nothing resolves as the attacker. Check Killer with Is Valid before granting kill credit, or a scoreboard will silently skip these deaths.
  • For Each Player includes dead bodies until they despawn. Gate on Is Player Alive before counting anyone as "outside", or your loop keeps "killing" corpses every tick.

Knock Out Player

actionserveraction.knockOutPlayer

Instantly knocks a player unconscious by draining their shock. They wake up naturally after a short while as shock recovers. To keep them down, re-run this on a timer or a zone-stay event.

Inputs
(exec)exec
Playerplayer
Outputs
(exec)exec

Instantly knocks a player unconscious by draining their shock to zero — the same faint a heavy hit to the head causes. They collapse where they stand, and On Player Knocked Out fires.

When to use it

Non-lethal punishment, stun traps, or the first half of a capture (knock out, then Set Player Restrained). For a graded hit that only might drop them, deal negative shock with Add Shock instead. End it early with Wake Up Player; see who is down with Is Player Unconscious.

Example

A stun anomaly: Player Entered Zone at the anomaly → Knock Out PlayerDelay 20 s → Wake Up Player — the delay carries the player through the wait, so the same person wakes up.

Watch out

  • The knockout is not permanent: shock recovers on its own and they wake after a short while. To keep someone down, re-run this on an Every N Seconds timer or an While Player In Zone tick.
  • An unconscious player is still alive and still counts in For Each Player loops — do not confuse down with dead.

Resync Player Gear

actionserveraction.resyncPlayerGear

Re-sends a player's worn and held items to everyone else. Fixes a player who looks naked to OTHER players while their own screen shows the gear — which happens when a loadout is given in the same moment the player is teleported. Run it after the last item is placed.

Inputs
(exec)exec
Playerplayer
Outputs
(exec)exec

Re-sends a player's worn and held items to every other player on the server. The player's own screen is already right — this fixes what everyone else sees.

The bug it exists for: items created on a player while the engine is rebuilding them for other clients — which happens right after a teleport — never reach those clients. The player sees their full kit; everyone else sees them naked, permanently. This node re-announces the gear and everyone's view snaps back.

When to use it

As the closing step of any loadout sequence that also teleports: teleport, wait, give gear, then Resync Player Gear. Also as a repair tool anywhere players report "so-and-so looks naked".

Example

A loadout that teleports first and dresses the player second: On Player ReadyTeleport Player (the spawn point) → Delay (2 seconds, carrying the Player) → Repeat (Times = 3) → the Body path runs Give Item To Player once per kit item, and the Completed pin runs Resync Player GearSend Notification ("Kitted up", 8 seconds). Hanging the resync off the Repeat Completed pin rather than Body is the whole trick: it fires once, after the last item is placed, and the notification lands after that — so the player is told they are kitted only when everyone else can already see the kit. Wiring it inside the loop instead would resync a half-finished set three times over and still miss the final item.

Watch out

  • Run it after the final item. It re-sends what the player is wearing at that moment — anything you give later needs another resync.
  • It is the backstop, not the fix. Prevention is a Delay of about 2 s between Teleport Player and the first give; resync then covers whatever slips through.

Set Broken Legs

actionserveraction.setBrokenLegs

Sets a player's leg state: healed, broken, or splinted.

Inputs
(exec)exec
Playerplayer
Outputs
(exec)exec
Settings
Stateselect · Healed | Broken | Splinted · default "Broken"required

Sets a player's legs to one of three states, picked in the panel. Broken is the vanilla fracture — hobbling, pain, no sprint. Splinted is the walkable-but-mending state a splint normally gives. Healed makes them whole again.

When to use it

Custom fall punishments, trap consequences, or the other direction: instant leg-fix items and medic services. Check the current state with Has Broken Legs. Heal Player Fully also heals legs as part of its sweep.

Example

A leg-fix item the server owner configures rather than you hard-coding it: On Item Injected fires when something is injected into a player → Get Entity Type (Item) gives the classname that was used → Repeat scans your leg_fix_items config list (Times = Config List Count) → Get Config Text At (the loop Index) → Text Equals against the injected type → Branch, and True runs Set Broken Legs (state Healed) on the event's Player, then Send Notification ("Your legs are set", 8 seconds).

The scan is what makes it configurable: nothing in the graph names Morphine, so adding another medical item is a config edit instead of a graph edit. Heal the event's Player pin and not the person holding the injector — Player is who received the injection, which is often a friend.

Watch out

The state is a panel choice, not a pin — a graph that both breaks and heals needs two of these nodes, one per state.

Set Player Blood

actionserveraction.setPlayerBlood

Sets a player's blood level (5000 = full; below 2500 they are dead). Blood slowly regenerates on its own over time — this sets it right now. The floor is not 0: PlayerConstants.BLOOD_THRESHOLD_FATAL is 2500, so setting anything below that kills the player outright rather than wounding them.

Inputs
(exec)exec
Playerplayer
Bloodfloat
Outputs
(exec)exec

Sets a player's blood level directly, where 5000 is full. The floor is 2500, not zero: PlayerConstants.BLOOD_THRESHOLD_FATAL is 2500, so anything below that is not a wounded player but a dead one. Blood is the slow stat — bleeding drains it and it regenerates on its own over time — and this node snaps it to a value right now. Low blood means the grey screen.

When to use it

Vampiric zones, transfusion mechanics, or setting up a wounded state that regular healing will slowly recover from. Overall health is the fast stat with its own node, Set Player Health. Read the current level with Get Player Blood.

Example

A blood-price shrine: Player Entered Zone at the shrine → Set Player Blood 3000 → Give Weapon as the reward — power for most of your blood, leaving them grey-screened and hunting for a transfusion. Do not price it at 2500: that is the fatal line, and the shrine would simply kill them.

Watch out

Regeneration undoes your work: a value you set drifts back up over the following minutes. For a lasting drain, pair it with Apply Bleeding or repeat it on a tick.

  • Values below 2500 do not wound, they kill. Clamp anything you compute so a

subtraction cannot fall through the floor by accident.

Set Player Direction

actionserveraction.setPlayerDirection

Turns a player to face a compass direction (0 = north, 90 = east).

Inputs
(exec)exec
Playerplayer
Facing (degrees)float
Outputs
(exec)exec

Turns a player's body to face a compass heading: 0 is north, 90 east, 180 south, 270 west. Position does not change — only the way they face.

When to use it

Mostly right after Teleport Player, so arrivals face the arena, the trader, or the door instead of a random wall. Read the current facing back with Get Player Direction. For objects and vehicles, use Set Entity Direction instead.

Example

On Player Ready (On Player Ready) → Teleport Player to your event stage → Set Player Direction 180, so every new arrival faces south toward the action.

Set Player Health

actionserveraction.setPlayerHealth

Sets a player's health, from 0% (dead) to 100% (full).

Inputs
(exec)exec
Playerplayer
Health %float
Outputs
(exec)exec

Sets a player's overall health as a percentage: 100 is full, 0 is dead. It sets rather than adds — running it twice with 50 leaves the player at 50, not 0.

When to use it

Softening or topping up a player by a known amount: a hardcore spawn that starts hurt, a shrine that restores. To kill outright, Kill Player is the clearer choice (it is the same thing as setting 0 here). Blood is a separate stat with its own node, Set Player Blood. Read the current value with Get Player Health.

Example

A hardcore start: On Player Respawned (On Player Respawned) → Set Player Health 65 → Send Notification "You wake up hurting. Find medicine."

Watch out

Setting 0 kills the player, and On Player Died then fires with an empty Killer — no one dealt the hit, so nothing resolves as the attacker. Gate any kill-credit logic with Is Valid.

Set Player Invulnerable

actionserveraction.setPlayerInvulnerable

Makes a player immune to all damage (on), or takes it away (off). This does NOT persist — set it off again on leave, and re-apply on enter for safezones.

Inputs
(exec)exec
Playerplayer
Invulnerablebool
Outputs
(exec)exec

Flips god mode for one player. On, they take no damage of any kind — bullets, falls, infected, gas, starvation ticks. Off restores normal damage. One node handles both directions through the checkbox.

When to use it

Safezones are the classic case; also event staging ("nobody dies during the briefing") and admin protection. Check the current state with Is Player Invulnerable.

Pins

Invulnerable — checked makes them immune; unchecked makes them mortal again.

Example

A trader safezone: Player Entered Zone at the trader → Set Player Invulnerable (checked) → Send Notification "Safezone"; and the mirror wiring on Player Left ZoneSet Player Invulnerable (unchecked). Stop All Bleeding on the way in rounds it out — protection does not close wounds they brought with them.

Watch out

  • The flag does not persist: a relog or server restart silently resets it to mortal. Treat it as something you re-apply on every enter, never something you set once.
  • Always build the "off" side. Without the Player Left Zone wiring, a player who visits the safezone keeps god mode for the rest of their session — everywhere.

Set Player Restrained

actionserveraction.restrainPlayer

Handcuffs a player (or releases them). A restrained player cannot use their hands until released.

Inputs
(exec)exec
Playerplayer
Restrainedbool
Outputs
(exec)exec

Puts a player into the restrained state — hands bound, unable to use items — or releases them when the box is unchecked. It is the same state vanilla handcuffs produce, but with no item involved: no cuffs appear on their wrists and no key exists.

When to use it

Jail and arrest systems, event staging ("everyone hold still"), or pairing with Knock Out Player for a capture mechanic. Check who is currently bound with Is Player Restrained.

Pins

Restrained — checked ties them up; unchecked sets them free. One node, both directions.

Example

A holding cell: Player Entered Zone on the cell → Set Player Restrained (checked); Player Left ZoneSet Player Restrained (unchecked). An admin drags a rule-breaker in, the graph does the rest.

Watch out

Because there is no cuffs item, nothing in the world can free them — no struggling out, no cutting loose. The only way out is this node with the box unchecked, so always build the release path before you build the restraint.

Set Player Stamina

actionserveraction.setPlayerStamina

Sets a player's stamina (0 = exhausted, 100 = full).

Inputs
(exec)exec
Playerplayer
Staminafloat
Outputs
(exec)exec

Sets the stamina bar right now: 0 exhausted, 100 full. It is a one-time set, not a lock — the bar drains and refills normally afterwards.

When to use it

Exhausting a player as a cost (0 after a teleport, so they cannot immediately sprint off) or refilling as a perk. Read the current value with Get Player Stamina. Note that Heal Player Fully does not touch stamina — this is the only node that does.

Example

An unlimited-stamina server: Every N Seconds (5) → For Each PlayerSet Player Stamina 100 — the bar never gets low enough to matter.

Set Quick Bar Slot

actionserveraction.setQuickBarSlot

Puts an item on one of the player's quick bar buttons, so a number key selects it. Slot 1 is the "1" key. Feed it an item another node made (the Weapon from Give Weapon, the Item from Give Item) or one found with Find Item On Player. Nothing happens if the item is missing.

Inputs
(exec)exec
Playerplayer
Itementity
Slot (1-10)int
Outputs
(exec)exec

The quick bar is the numbered row at the bottom of a player's screen — press "1" and the item in slot 1 comes to hand. This node fills one of those slots from the server, the same shortcut assignment the game makes when a player drags an item onto the bar themselves.

It needs a live item, not a classname: wire in the actual thing you gave or found. If the item pin comes up empty the node quietly does nothing, so a failed lookup upstream just skips the slot.

When to use it

Right after handing out a loadout, so the rifle sits on "1" and the bandage on "4" without the player arranging anything. This node does not give items — Give Weapon and Give Item To Player do that, and both output the created item you can feed straight in here. To bind something the player already carries, find it first with Find Item On Player.

Pins

Item — a live item reference (the Weapon out of Give Weapon, the Item out of Give Item, or a Find Item On Player result). Not a classname.

Slot (1-10) — 1 is the "1" key, 10 is the "0" key.

Example

The full dance, binding a loadout to the bar after handing it out: On Player ReadyGive Weapon (M4A1 with Mag_STANAG_30Rnd) → Give Item To Player (BandageDressing) → Delay (2 seconds, carrying the Player) → Repeat (Times = 2) walks your quickbar list — each pass runs Find Item On Player for that entry's classname into Set Quick Bar Slot, with Slot wired as the loop Index + 1.

Two details carry the example. The wait sits between giving and binding, because the client has to have the items before a slot can point at one. And the item is looked up again after the wait rather than reusing the Weapon output of Give Weapon — a delay carries only the player across, so that reference is gone by the time the loop runs. Index + 1 is because loop indexes start at 0 and quick bar slots start at 1.

Watch out

  • The slot references the item on the player's own machine. If the item was created a moment ago it may not have replicated to their client yet, and the slot lands empty. Assign the quick bar a couple of seconds after giving the items — a Delay of about 2 s is there for exactly this.
  • Find Item On Player returns the first match, so duplicate classnames in a kit list all bind the same single item.
  • After a Delay the only data carried over is the player. Stamp anything else the binding needs — which kit was rolled, for instance — onto the player with Set Player Number before the wait and read it back after, rather than trusting a global: another player's event can overwrite a global while you are waiting, and the quick bar then binds someone else's loadout.

Stop All Bleeding

actionserveraction.stopAllBleeding

Closes all of a player's bleeding wounds.

Inputs
(exec)exec
Playerplayer
Outputs
(exec)exec

Closes every open wound on a player at once, however many there are — an instant full bandage that consumes nothing. The counterpart to Apply Bleeding.

When to use it

Safezone entry, a medic reward, or cleanup before a fair fight. It is already part of Heal Player Fully, so wire it alone when you want the bleeding gone but the rest of their state untouched. Check first with Is Player Bleeding, or count wounds with Get Bleeding Wounds.

Example

A safezone that patches you up on the way in: Player Entered Zone at the trader → Stop All BleedingSet Player Invulnerable (checked) — wounds close at the gate and no new ones open inside.

Wake Up Player

actionserveraction.wakeUpPlayer

Brings an unconscious player back round. The counterpart to Knock Out Player. Refills their shock, which is what keeps a player down.

Inputs
(exec)exec
Playerplayer
Outputs
(exec)exec

Brings an unconscious player back round immediately. Shock is the hidden meter that keeps a player down; this node refills it to full, which is what standing back up requires. The counterpart to Knock Out Player.

When to use it

Revive mechanics, medic events, or an admin "get up" tool. To help a player recover without instantly waking them, add a positive amount with Add Shock instead. On Player Woke Up fires when they come round, and Is Player Unconscious tells you who is down.

Example

A "no knockouts" arena: Every N Seconds (5) → For Each PlayerIs Player Unconscious into a Branch → on true, Wake Up Player.

Watch out

Waking treats the symptom, not the cause. If something keeps draining shock — a gas zone ticking Add Shock, a repeated knockout on a timer — they will drop again moments later.

Actions/UI

Close Menu

actionclientaction.uiCloseMenu

Closes the open menu for this layout.

Inputs
(exec)exec
Outputs
(exec)exec
Settings
Menu LayoutlayoutPickerrequired

Shuts the menu for one of your layouts on this player's screen. Closing it also hands the player back their character: while one of these menus is open the mouse cursor is showing and player control is switched off, and this node reverses both.

Players can already close a menu with Escape — the generated menu handles that for you. This node is for the other case: the button did its job, so the menu should get out of the way by itself.

When to use it

The last step of a menu button: confirm, apply, cancel. If the menu should stay open and just report back, use Set Widget Text instead and leave it on screen.

Pins

Menu Layout (panel) — which layout's menu to close. It only closes that one, and does nothing when it is not open.

Example

A confirm button that closes behind itself: On Button Clicked (your layout, button ConfirmButton) → Set Widget Text (label StatusLabel, "Confirmed") → Close MenuTeleport Player (the spawn position). The two client-side nodes run on the player's machine in order, then the chain reaches the teleport and hands off to the server, which does the work with the menu already gone.

A cancel button is the same idea with nothing after it: On Button Clicked (button CancelButton) → Close Menu.

Watch out

  • Client-side only. It needs the mod installed on players' machines; a server-only build has no menus to close.
  • It must come BEFORE any server action in the chain. Everything after the first server node runs on the server, where there is no menu — the editor blocks that ordering and points at the node to move.
  • Put it after your Set Widget Text calls, not before. Once the menu is closed there is nothing to write into, and those writes quietly do nothing.
  • Only one menu can be open at a time. Your menu will not open while the player has the inventory or another menu up, which is worth knowing when a menu seems not to respond to its key.
  • Reopening builds the menu again from the layout file, so it comes back in its authored state — anything the player typed or you wrote into it is gone.

Set Widget Text

actionclientaction.uiSetWidgetText

Sets the text shown on a text/label/button widget in the open menu.

Inputs
(exec)exec
Textstring
Outputs
(exec)exec
Settings
Menu LayoutlayoutPickerrequired
WidgetwidgetPickerrequired

Rewrites the text on one widget inside a menu that is open on this player's screen. Each layout you attach to the project becomes a real in-game menu; this node reaches into the open one, finds the widget by the name it has in the layout, and puts your text on it.

It handles the three widgets that carry text: a label (text widget), a text box, and a button's caption. Anything else in the layout — images, sliders, checkboxes, panels — is found but left untouched, with no error. And because it works on the menu that is currently open, it does nothing at all when the menu is closed.

When to use it

Everything a menu says back to the player: a status line after they press a button, a result, a running total, prefilling a text box with a suggested value. For text on an always-on HUD overlay rather than a menu, use Set Text. To read what the player typed instead of writing to it, use Get Text Box Text.

Pins

Menu Layout (panel) — which of your attached layouts this refers to. It must be the same layout the menu was opened from.

Widget (panel) — picked by name from that layout. Rename the widget in the layout editor and the editor flags the node, so it cannot silently point at nothing.

Text — what to display. Build it from live values with Join Text.

Example

A shop button that answers the player. On Button Clicked (your layout, button BuyButton) → Set Widget Text (widget StatusLabel, "Order sent") → Give Item To Player, with Get Text Box Text (text box ItemBox) wired into its Item Class pin so the player gets whatever they typed.

Read the order carefully. The label is written first, on the player's own machine; only then does the chain reach Give Item To Player — a server node — and hand off to the server. Put the Set Widget Text after the give and it would land in the server half, where there is no menu to write into: the editor refuses to build that graph and tells you to move it up. The text box reading is fine on either side of the handoff, because a widget value consumed by a server node is read on the client and carried across for you.

Watch out

  • Client-side only. The mod has to be installed on players' machines (a server-and-client project), and any menu is invisible on a server-only install.
  • It must come BEFORE every server action in the chain. A menu button starts on the player's client and moves to the server the moment it reaches a server node — everything after that point runs there, where the menu does not exist. The editor blocks this with a clear message, but the fix is always the same: move the client feedback up.
  • Only labels, text boxes and buttons respond. Pointing it at an image or a slider does nothing and reports nothing.
  • Closing and reopening the menu rebuilds it from the layout file, so anything you wrote is back to the text you authored. Text set here lasts as long as the menu stays open, no longer.
  • It writes to the menu of the player running the chain. There is no way from here to change what someone else is looking at — for that, send them a message with Send Client Message and act on it in their own On Client Message.

Actions/Variables

Add To Global Number

actionserveraction.addGlobalNumber

Adds an amount to a global number (use a negative amount to subtract).

Inputs
(exec)exec
Amountfloat
Outputs
(exec)exec
Settings
Nametext · default "score"required

Bumps a shared server number by an amount, in one node. It reads the current value, adds yours, and writes the result back to the same named slot Set Global Number and Get Global Number use. A negative Amount subtracts — there is no separate "take away" node.

Like every global, it lives in memory and starts at 0 again after a restart.

When to use it

Counters that belong to the server rather than to a person: total kills this restart, crates dropped, how many players have finished the event. Use Set Global Number when you want to force a value rather than adjust it, Add To Player Number when the tally is one player's, and Add To Saved Number when it has to survive a restart.

Counter looks similar but is not the same thing: it counts how many times one point in one graph is reached. This node counts a value that any graph can read, write and reset.

Example

A milestone announcement. On Player DiedAdd To Global Number (Name "kills", Amount 1) → Get Global Number ("kills") → To Whole NumberRemainder (Modulo) (B = 10) → Equals (Numbers) (B = 0) → Branch → True path → Broadcast Chat Message ("10 more have fallen"). Every tenth death on the server announces itself, and the running total is available to any other graph that wants it.

The To Whole Number step in the middle is not decoration. A global is a decimal number and Remainder only takes whole ones, so without it the editor refuses the wire.

Watch out

  • The Name must match the other nodes exactly. Case counts ("Kills" is not

"kills"), and spaces and punctuation are stripped, so "kill count" and "killcount" are the same slot.

  • One value for the whole server. Adding under a player event adds once per

player, not once per player each.

lifetime total.

  • Reading the tally back gives a decimal, even when you only ever add whole

numbers. Pins that want a whole number — Remainder (Modulo), any "Index (from 0)" — need To Whole Number in between; NodeZ never narrows a decimal behind your back.

Add To Player Number

actionserveraction.addPlayerNumber

Adds an amount to a number stored on one player (use a negative amount to subtract). Lasts only for that player's session — it is gone when they leave, and never saved.

Inputs
(exec)exec
Playerplayer
Amountfloat
Outputs
(exec)exec
Settings
Nametext · default "team"required

Adds an amount to a number stored on one player, reading the current value and writing the new one in a single node. A negative Amount subtracts. It uses the same named slots as Set Player Number and Get Player Number, so all three can share a Name.

A player who has never had that name set counts as 0, so the first add on a fresh player leaves them on the Amount you passed.

When to use it

Per-person tallies that only need to last the session: a kill streak, points this round, how many times someone has used a shop. Reach for Set Player Number when you want to force a value — resetting a streak to 0, for instance — and Add To Saved Player Number when the tally should still be there after a restart. Add To Global Number is the one-number- for-everyone version.

Example

A kill streak that announces itself and resets on death. On Player DiedSequence. Then 0 runs Is Valid on the event's Killer → Branch → True path → Add To Player Number (Killer, Name "streak", Amount 1) → Get Player Number (Killer, "streak") → Equals (Numbers) (B = 5) → Branch → True path → Broadcast Chat Message. Then 1 runs Set Player Number (Victim, "streak", Value 0) so the person who just died starts again.

The Is Valid check matters: a death by infected, fall or bleed-out has no killer, and adding to an empty player is silently dropped rather than credited to anyone.

Watch out

  • Session only, never saved. A disconnect wipes the number.
  • An empty Player pin makes the node do nothing at all, without an error.
  • The Name must match the reading node exactly, spaces and case included.
  • Use Sequence rather than running two arms of a Branch back

into the same node — converging exec wires make the compiler duplicate everything downstream under both.

Add To Saved Number

actionserveraction.addSavedNumber

Adds an amount to a saved number (negative subtracts). The new total is saved straight away.

Inputs
(exec)exec
Amountfloat
Outputs
(exec)exec
Settings
Nametext · default "total"required

Adds an amount to a saved server number and writes the new total straight to disk. It reads, adds and stores in one node, against the same names Set Saved Number and Get Saved Number use. A negative Amount subtracts, and a name that has never been saved counts as 0.

When to use it

Lifetime tallies for the server: total kills since the mod was installed, how many airdrops have ever landed, an event counter that must not reset when you restart for a patch. Add To Global Number is the memory-only version, and Add To Saved Player Number is the one that credits a person rather than the server.

Example

A running total announced once a day. On Player DiedAdd To Saved Number (Name "total_kills", Amount 1). Then, in the same project, Daily At Time (Hour 3, Minute 0) → Get Saved Number ("total_kills") → Join Text ("Deaths so far: " and the number) → Broadcast Chat Message.

Nothing has to survive in memory between the two graphs, and a restart in between changes nothing — that is the whole point of using the saved version here rather than Add To Global Number. Note that Daily At Time runs on the in-game day/night clock, not the wall clock, so on a fast time acceleration this announces several times a real day.

Watch out

  • Each add rewrites the saved file. One write per death is fine; one per second

from an Every N Seconds tick, or one per player inside a For Each Player loop, is not. Total it up in a memory global and save once at the end instead.

  • The file is loaded once at server start and kept in memory. Editing

persist.json by hand while the server runs is undone by the next add.

  • The Name is matched exactly — case and spaces both count.

Add To Saved Player Number

actionserveraction.addSavedPlayerNumber

Adds an amount to a player's saved number (negative subtracts) — perfect for kill counts, money, or points.

Inputs
(exec)exec
Playerplayer
Amountfloat
Outputs
(exec)exec
Settings
Nametext · default "kills"required

The stats workhorse. It adds an amount to a number stored permanently against a player's Steam ID — reading the current figure, adding yours, and writing the result to disk in one node. A negative Amount subtracts, and a player with no entry yet counts as 0, so the first kill leaves them on 1 without any setup.

Because the key is the Steam ID rather than the character, a player's total survives death, respawn, a fresh start and a server restart. It is the same store Set Saved Player Number writes and Get Saved Player Number reads.

When to use it

Kill counts, deaths, money, points, bounties, quest progress — every number a player expects to still be theirs tomorrow. Use Add To Player Number for the session-only equivalent (a kill streak that should reset when they log off), and Add To Saved Number when the tally belongs to the server rather than any one person.

Pair it with For Each Player (Ranked), which reads exactly these values: set its Number Name to match and its Stored As to "Saved Player Number", and it walks everyone in score order for you.

Example

Start from the Kill reward template (File → New from template). It already has the right shape — On Player DiedIs Valid on the Killer → Branch — so hang Add To Saved Player Number (Killer, Name "kills", Amount 1) on the True path and the kill reward becomes a permanent scoreboard.

Then read it back anywhere. A top-three announcement: Daily At Time (Hour 20) → For Each Player (Ranked) (Number Name "kills", Stored As "Saved Player Number", Order "Highest first") → Body → Less Than (the loop's Rank, B = 4) → Branch → True path → Join Text building "1. Name — 37" from the loop's Rank, Value and Get Player NameBroadcast Chat Message. Rank counts from 1 and Value is that player's stored number, so the top three rows come straight out of the loop.

Watch out

  • The Is Valid check on the Killer is not optional. Deaths by infected, falls,

drowning and bleed-outs have no killer, and adding to an empty player is dropped in silence — you would simply see kills going missing.

  • Only headshots to the "Brain" zone register as headshots if you are counting

those separately; a graze to the head does not. See Was Killed By Headshot.

  • Every add rewrites the whole saved file. One write per kill is fine. One per

player per tick is not — keep fast-moving tallies in Add To Player Number and commit the total when the round ends.

  • It needs the player to be connected; there is no way to credit someone who

has already left. If credit has to survive them logging off mid-fight, record their Steam ID at the time with Set Player Text and settle up on their next join.

  • The Name is matched exactly — case and spaces both count, and a typo quietly

starts a second, separate tally.

Remember Item

actionserveraction.setGlobalItem

Remembers an item under a name, so a later node — or the next pass of a loop — can use it. The way to carry "the thing I just made" forward: attach something, remember it, then attach the next thing to THAT. Reads back empty if the item is gone.

Inputs
(exec)exec
Itementity
Outputs
(exec)exec
Settings
Nametext · default "item"required

Remembers an actual thing — the item, vehicle or object another node just made — under a name, so a node further down the chain can pick it up again with Get Remembered Item. Numbers and positions are values you can copy; this stores a handle to something that exists in the world.

That handle is deliberately weak. If the thing is destroyed, taken apart, or cleaned up by the server, the name reads back empty rather than pointing at rubble. It is built for carrying "the thing I just created" a short distance through a graph, not for keeping a permanent register of objects.

When to use it

The case it exists for is Delay. A delay compiles the rest of the chain into a separate piece of work that runs later, and the editor will refuse to let you wire anything from before the wait into the Then path — only the carried Player crosses. Stash the item here before the wait and read it back after, and the chain survives.

The other case is a loop: remember what this pass created so the next pass can attach to it, or so the work after the loop can finish it off.

If you only need the item within one straight run of nodes, you do not need this at all — wire the creating node's Item output directly. And if the point is to recognise your item later among identical ones, tag it with Tag Item instead; a tag is written on the item itself and survives anything.

Example

An airdrop crate that cleans itself up ten minutes later. Every N Seconds (Every 1800) → Spawn Item (SeaChest) → Remember Item (Name "airdrop") on the spawn's Item output → Delay (600 seconds) → Get Remembered Item ("airdrop") → Is ValidBranch → True path → Delete Entity.

Two things earn their keep. The remember-and-read pair is what gets the crate across the ten-minute wait at all. The Is Valid check is what stops the delete running on nothing when a player has already looted and destroyed the crate — the name reads back empty in that case, quietly.

Watch out

  • One slot per Name, shared by the whole server. If two crates can be in the

air at once, the second overwrites the first and the older one is never cleaned up. Give each its own Name, or do not let them overlap.

  • Reading back empty is normal, not an error. Always check with

Is Valid before acting on it.

  • This is not storage. It remembers nothing across a server restart, and it

cannot tell your item from an identical one a player dropped — that is what Tag Item and Get Item Tag are for.

  • Item names live in their own set of slots, so "drop" here and "drop" in

Set Global Number are unrelated. The Name is matched with spaces and punctuation stripped, and case counts.

Set Global Number

actionserveraction.setGlobalNumber

Stores a number under a name, shared across the whole server. Every node using the same Name reads and writes the same value. It resets when the server restarts.

Inputs
(exec)exec
Valuefloat
Outputs
(exec)exec
Settings
Nametext · default "score"required

A named number the whole server shares. Every node that uses the same Name reads and writes the same single slot, no matter which graph or which event it sits in — so a number stamped here during one player's death event is the same number a timer reads five minutes later.

It lives in memory only. When the server restarts it is back to 0. Think of it as the server's own scratch pad: the round number, how many crates are out, whether the boss event is running. It is not the player's — one value exists for everyone.

When to use it

Two jobs. First, plain server state: a round counter, a flag, a threshold. Second — and this is the one people miss — pinning down a value that would otherwise change. Random Number and Random Config Text re-roll every single place you wire them, so one roll used in three nodes gives three different answers. Roll once, store it here, and read it back with Get Global Number everywhere else.

For a number that belongs to one person use Set Player Number. For one that must survive a restart use Set Saved Number. To bump a value rather than overwrite it, Add To Global Number does the read and the write in one node.

Pins

Name — the slot's identity. Matched exactly, and case matters: "Score" and "score" are two different numbers. Punctuation and spaces are stripped, so "kill count" and "killcount" end up as the same slot. Numbers, positions (Set Global Position) and items (Remember Item) are kept apart, so the same Name in all three is three separate values.

Example

An airdrop that picks one site and then uses it consistently. Put two config lists side by side — a position list drop_sites, and a text list drop_names holding the place names, in the same order.

Every N Seconds (Every 1800) → Random Number (Min 0, Max = Config List Count of drop_sites) → Set Global Number (Name "drop_index") → Spawn Item (SeaChest) with Position from Get Config Position At (drop_sites), then Broadcast Notification with the text from Get Config Text At (drop_names).

Both of those config nodes take a whole number in Index (from 0), and Get Global Number hands back a decimal, so the index goes through one To Whole Number on the way: Get Global Number ("drop_index") → To Whole Number → the Index pin on both. Wire the global straight in and the editor refuses the connection.

The roll happens once and is written down. Both lists are then indexed by that one stored number, so the crate and the announcement can never disagree — which is exactly what happens if you wire the Random Number node into both directly. Max counts up to but not including the number you give it, so the list count itself is the right Max for a list index.

Watch out

  • Shared means shared. Under a player event the value is whoever ran it last.

If it should describe a person, use Set Player Number instead.

  • A global written before a Delay can be overwritten by another

player's event during the wait. The Then path then reads someone else's value. Stamp it on the player before the wait instead.

  • Reading a name that was never written gives 0, so 0 cannot be told apart from

"not set yet". Start meaningful codes at 1.

that is written to disk.

Set Global Position

actionserveraction.setGlobalPosition

Stores a position under a name, shared across the whole server. The way to keep a position you worked out earlier — pick candidate points in a loop, remember the best one, then use it after the loop. Resets when the server restarts.

Inputs
(exec)exec
Positionvector
Outputs
(exec)exec
Settings
Nametext · default "point"required

Writes a position down under a name so any node, anywhere in the project, can read it back with Get Global Position. It is the same shared server scratch pad as Set Global Number, holding a point in the world instead of a number.

Positions get their own set of slots, so a global number called "drop" and a global position called "drop" are two different values and never collide. Like all globals it lives in memory: after a restart every stored position is back to 0 0 0.

When to use it

Whenever a point is worked out in one place and needed in another. The classic shape is a loop that examines candidates and remembers the best one — you cannot carry a value out of a loop body any other way, so you write the winner here and read it after the loop finishes.

It is also how a rolled position stops moving. Random Point Near and Random Config Position pick a fresh point at every place you wire them, so a crate spawned at one and announced at another lands in two different spots. Store the roll once and everything downstream agrees.

For a point that belongs to one player, there is no per-player position — store its text form with Set Player Text and convert with Text To Position instead.

Example

One airdrop site, used three times. Every N Seconds (Every 1800) → Random Config Position (list drop_sites) → Snap To GroundSet Global Position (Name "drop"). Then, still under that event, Spawn Item (SeaChest) with Position from Get Global Position ("drop"), and Broadcast Notification telling players where to go. Ten minutes later a separate Every N Seconds reads the same "drop" position into Delete Items In Radius to sweep whatever nobody collected.

The crate, the announcement and the cleanup all point at one stored roll. Wire the Random Config Position node into all three instead, and you get three unrelated map corners.

Watch out

  • A never-written name reads back as 0 0 0. That is a real place on the map —

the south-west corner of the world — so a graph with a typo in the Name silently spawns things in the sea instead of erroring. Pair the position with a "have I set this" flag (Set Global Number) when it matters.

  • One value for the whole server. Two overlapping events using the same Name

will overwrite each other; give each its own Name.

  • A position written before a Delay can be replaced during the wait by

another run of the same graph. Give the second event its own Name, or make the wait short enough that they cannot overlap.

  • The Name is matched with spaces and punctuation stripped, and case still

counts: "Drop" and "drop" are two slots, "drop site" and "dropsite" are one.

  • Cleared to 0 0 0 on every server restart.

Set Player Number

actionserveraction.setPlayerNumber

Stores a number on one player under a name (e.g. which team they are on). Lasts only for that player's session — it is gone when they leave, and never saved.

Inputs
(exec)exec
Playerplayer
Valuefloat
Outputs
(exec)exec
Settings
Nametext · default "team"required

Writes a number onto one player under a name. Each player carries their own set, so "team" can be 1 for one person and 2 for another at the same time — the thing a global number cannot do. Read it back with Get Player Number.

The value lives on the character in memory. Nothing is written to disk and nothing is sent to the client; it is a note the server keeps about that person for as long as they are connected. When they leave, it is gone.

When to use it

Anything that describes a person for the duration of a session: which team they are on, which kit they rolled, a kill streak, the game time a cooldown started.

It is also the reliable way to carry a value across a Delay. Only the carried Player survives a wait, so a global written before the wait can be overwritten by the next player's event while you are counting down — and the graph then acts on somebody else's value. A number stamped on the player cannot be, because it travels with them.

Use Add To Player Number to adjust rather than overwrite, Set Player Text when the value is words rather than digits, Set Saved Player Number when it must still be there tomorrow, and Set Global Number for something that belongs to the server.

Pins

Player — who the note is about. If this comes in empty the write is quietly skipped, so a failed lookup upstream loses the value without an error.

Name — matched exactly, spaces and case included. "kit" and "Kit" are two different numbers on the same player.

Example

Random loadouts that stay random-once. On Player ReadyRandom Number (Min 1, Max 4 — Max is not included, so this rolls 1, 2 or 3) → Set Player Number (Player from the event, Name "kit") → Delay (3 seconds, Carry Player wired from the event) → Get Player Number (the delay's Player, "kit") → Equals (Numbers) (B = 1) → Branch, with the False path testing 2, and so on into three different Give Weapon kits.

Three details make it work. The roll happens once and is written down, because a Random Number node wired into three comparisons rolls three separate times. The wait is there because gear handed out too early does not reach the client. And the kit number rides on the player through the wait, so two people joining a second apart each get the kit they actually rolled.

Watch out

  • Session only. It is gone when the player disconnects, and it is never saved —

Set Saved Player Number is the version that is written to disk.

  • A name that was never set reads back as 0, so 0 and "not set" look identical.

Start team and kit numbers at 1 and keep 0 as the "no answer" case.

  • An empty Player pin means nothing is written and nothing complains. Check

with Is Valid when the player came from a lookup like Get Player By Name.

Is Player Alive before stamping a value that only makes sense for someone still playing.

Set Player Text

actionserveraction.setPlayerText

Stores a line of text on one player under a name. Holding a Steam ID here is how you remember ANOTHER player without keeping hold of them — look them up again with Get Player By Steam ID, and nothing breaks if they left. Lasts for one session only, and is never saved.

Inputs
(exec)exec
Playerplayer
Valuestring
Outputs
(exec)exec
Settings
Nametext · default "tag"required

Writes a line of text onto one player under a name — a classname, a role, a label, a Steam ID. It is the words version of Set Player Number, with its own set of slots, and it is read back with Get Player Text. The text lives on the character in memory for as long as they are connected; nothing is saved and nothing reaches the client.

The trick worth knowing is what it lets you store safely. You cannot keep hold of another player across time — they can disconnect and the reference goes stale. A Steam ID is just text, so it never goes stale. Store the ID here and turn it back into a live player with Get Player By Steam ID when you actually need them; if they left, the lookup simply comes back empty.

When to use it

Remembering something about a player in words: which faction they picked, the classname of the kit they rolled, the name of the zone they are standing in, or — through the Steam ID trick — who last shot them.

Use Set Player Number when a number will do; numbers compare and add, text does not. Use Set Global Number or Set Global Position for anything that belongs to the server rather than a person. There is no saved text — if a label has to survive a restart, map it to a number and use Set Saved Player Number.

Pins

Player — who the note is about. An empty pin means the write is quietly skipped.

Name — matched exactly. Case and spaces count.

Value — plain text. It comes back byte for byte, so a classname stored here is still case-sensitive when you use it later.

Example

Kill credit that survives a bleed-out. The engine only reports a killer for a direct kill — bleeding out, falling and drowning all leave the Killer pin empty — so keep your own record.

On Player Took DamageIs Valid on the Attacker → Branch → True path → Get Player Steam ID (Attacker) → Set Player Text (Victim, Name "lastHit"). Then a second graph: On Player DiedGet Player Text (Victim, "lastHit") → Get Player By Steam IDIs ValidBranch → True path → Add To Saved Player Number (that player, "kills", 1) and Send Notification.

The ID is written on the victim, so two fights happening at once cannot mix each other up. The lookup at the end is what handles the shooter having logged off in the meantime — you get empty text or an empty player, never a broken graph.

Watch out

  • Session only, never saved, and gone the moment the player disconnects.
  • A name that was never set reads back as empty text. That is indistinguishable

from a name you set to "" on purpose.

  • An empty Player pin drops the write silently — no error, no log line.
  • Storing a live player is not an option; store their Steam ID with

Get Player Steam ID and look them up again. A Steam ID is safe to hold for as long as you like, a player reference is not.

  • Classnames kept here stay case-sensitive: "GasMask" works, "Gasmask" fails

forever and silently when you feed it to a spawn node.

Set Saved Number

actionserveraction.setSavedNumber

Stores a number under a name and SAVES it, so it is still there after a server restart. Saved in $profile:<YourMod>/persist.json. Use a plain Global Number instead when the value should reset each restart.

Inputs
(exec)exec
Valuefloat
Outputs
(exec)exec
Settings
Nametext · default "total"required

A server number that is written to disk. Where Set Global Number keeps its value in memory and forgets it on restart, this one is saved into $profile:<YourMod>/persist.json the instant you set it, and is still there when the server comes back up. Read it with Get Saved Number.

The file is plain JSON with the names and values side by side, so you can open it in a text editor to see what your mod has stored — or to fix a number by hand while the server is stopped.

When to use it

Anything that must outlive a restart and belongs to the server rather than to a person: the season number, a lifetime total, a "the world has already been seeded" flag, the timestamp of the last event.

Prefer Set Global Number when the value is meant to reset each restart — it is faster and it makes the intent obvious. Use Set Saved Player Number for something a person owns, and Add To Saved Number to adjust a saved total rather than overwrite it.

Example

One-time world setup. On Server StartedGet Saved Number ("seeded") → Equals (Numbers) (B = 0) → Branch → True path → For Each Config Position over your props list → Spawn Static Object at each, then after the loop Set Saved Number (Name "seeded", Value 1).

Do Once would look like the obvious node here, but its latch is in memory: it opens again at the next restart and you would get a second copy of every prop. A saved flag is what makes "once, ever" actually mean once.

Watch out

  • Every set rewrites the whole file. That is nothing for a handful of events a

day, but do not put this under Every N Seconds with a short interval or inside a loop over every player — use a memory global while the work is running and save the result once at the end.

  • The file is read once when the server starts and then held in memory, so

editing persist.json while the server is running achieves nothing — the next save overwrites your change. Stop the server first.

  • A name that was never saved reads back as 0. A flag set to 0 and a flag never

set are the same thing.

  • Numbers only. There is no saved-text node; if you need a saved label, store a

number that stands for it and keep the labels in your config.

  • The Name is matched exactly and case counts.

Set Saved Player Number

actionserveraction.setSavedPlayerNumber

Stores a number on one player and SAVES it — still there when they rejoin, even after a restart or a fresh character. Saved against their Steam ID in $profile:<YourMod>/persist.json.

Inputs
(exec)exec
Playerplayer
Valuefloat
Outputs
(exec)exec
Settings
Nametext · default "kills"required

Stores a number against a player and writes it to disk. It is keyed on their Steam ID, not on their character — so the value follows the person. They can die, respawn as a fresh character, disconnect for a week, and it is still theirs when they come back. Read it with Get Saved Player Number.

Everything goes into $profile:<YourMod>/persist.json, one entry per player per name, written the moment you set it. That file is yours to inspect; the Steam ID sits right there next to the value.

When to use it

Anything a player owns permanently: currency, rank, lifetime kills, unlocks, donor tier, a permanent ban-from-the-arena flag. If the answer to "should this still be true tomorrow?" is yes, it belongs here.

Set Player Number is the session version — cheaper, and correct for things like a kill streak or which team they are on this match. Use Add To Saved Player Number to adjust a stored total rather than overwrite it, and Set Saved Number when the number belongs to the server.

Pins

Player — whose value it is. The write needs their network identity to build the key, so a player pin that is empty, or a character whose connection has already gone, is skipped without an error.

Name — matched exactly, case and spaces included.

Example

A season wipe that reaches everybody, including players who were offline when you called it. The trick is to stamp a season number on each player and reset them lazily, the first time they join in a new season.

Bump the server's season by hand with Set Saved Number ("season") when you want a new one. Then: On Player ReadyGet Saved Player Number (Player, "season") → Equals (Numbers) against Get Saved Number ("season") → NotBranch → True path → Set Saved Player Number (Player, "kills", Value 0) → Set Saved Player Number (Player, "season", Value from Get Saved Number "season") → Send Notification ("New season", "Your score has been reset").

Looping over everyone online with For Each Player and zeroing them looks simpler, but it only clears the people who happen to be logged in at that moment — everybody else keeps last season's total. Comparing a stored season number on join has no such hole.

Watch out

  • It only works on someone connected. There is no way to write a value for an

offline player, and a write with an empty Player pin is dropped silently.

  • Every set rewrites the whole saved file. Setting one value per player inside

a loop over a full server is a burst of writes — fine as a one-off, wrong for anything on a tick.

Is Player Alive if you ever do loop over everyone.

  • The file is read once at server start and kept in memory. Hand-editing it

while the server is running is overwritten by the next save.

  • A player with no entry reads back as 0, which is the same as a player you

deliberately set to 0.

  • Values are keyed by Steam ID, so a player using a different account is a

different person as far as this node is concerned.

Actions/Vehicles

Refuel Vehicle

actionserveraction.refuelVehicle

Adds fuel (or oil/coolant/brake fluid) to a vehicle.

Inputs
(exec)exec
Vehicleentity
Amountfloatoptional
Outputs
(exec)exec
Settings
Fluidselect · Fuel | Oil | Brake | Coolant · default "Fuel"required
Modeselect · Fill To Full | Add Amount · default "Fill To Full"required

Tops up one of a vehicle's four fluids — fuel, oil, brake fluid or coolant — from the server, with no jerrycan and no player standing there. It is the same fill the game performs when someone pours a canister in.

Two modes. "Fill To Full" asks the vehicle its own tank capacity and pours in exactly that much, so it works on any model without you knowing the numbers. "Add Amount" pours in the number on the Amount pin instead, which is an absolute measure of that fluid and not a percentage — and tank sizes differ between models, so a figure that half-fills an Olga will not half-fill a truck.

Anything that is not a vehicle is ignored. Wire a player, an item or an empty pin in and the node quietly does nothing.

When to use it

Refuel stations, a "call for fuel" reward, keeping event vehicles topped up, or finishing off a car right after Spawn Vehicle (which already fills a fresh car for you — you only need this node later on).

To check the level first, Get Vehicle Fuel reports fuel as 0 to 1. To fix a damaged vehicle rather than fill it, use Repair Entity.

Pins

Vehicle — the car. Usually from Get Player Vehicle, from the Vehicle pin of On Player Entered Vehicle, or from Spawn Vehicle.

Amount — used only in "Add Amount" mode. Fill To Full ignores it entirely, so a value sitting in this pin while the mode is Fill To Full is not a bug.

Fluid — Fuel, Oil, Brake or Coolant. The diesel 4x4 and the M3S truck have no radiator, so filling Coolant on those does nothing.

Example

A working fuel station. On Hold Interaction (Object Class the fuel pump you want usable, Prompt Text "Refuel vehicle", Hold Seconds 6) → Get Player Vehicle on the event's Player → Is ValidBranch → True path → Refuel Vehicle (Fluid Fuel, Mode "Fill To Full") → Send Notification ("Refuelled", "Tank is full").

The Is Valid check turns "hold F on the pump while sitting in a car" into the condition — on foot the player gets nothing rather than a silent no-op. Get Player Vehicle answers for any seat, so a passenger can fill the tank too, which is usually what you want at a pump.

Watch out

  • The fill itself always happens on the server. Triggering it from an

interaction, a keybind or a menu button is fine — the round trip is automatic — but those prompts are drawn on the player's machine, so a mod built that way must be installed on players' clients too, not just the server.

  • Add Amount is in the fluid's own units, not a percentage and not a

fraction. If you want "half a tank", spawn the car with Spawn Vehicle's Fuel % pin instead, which is a real percentage.

  • Filling a fluid the model does not have is silently pointless — coolant on

the 4x4 or the truck, for instance.

  • A ruined engine or a missing part is not a fuel problem. Fuel alone will not

make a car start; see Vehicle Engine.

Spawn Vehicle

actionserveraction.spawnVehicle

Spawns a fully drivable vehicle — wheels, battery, plugs, radiator, and fluids all fitted. Comes with the exact parts that model needs to run. Doors, hood, and trunk are left off (the engine still runs); add them in-game if you want them.

Inputs
(exec)exec
Positionvector
Fuel %floatoptional
Outputs
(exec)exec
Vehicleentity
Settings
Vehicleselect · Hatchback_02 | Hatchback_02_Black | Hatchback_02_Blue | Sedan_02 | Sedan_02_Red | Sedan_02_Grey | CivilianSedan | CivilianSedan_Wine | CivilianSedan_Black | OffroadHatchback | OffroadHatchback_Blue | OffroadHatchback_White | Offroad_02 | Truck_01_Covered | Truck_01_Covered_Blue | Truck_01_Covered_Orange · default "Hatchback_02"required

Puts a car on the map that you can actually get in and drive away. A vehicle spawned raw by classname is a shell — no wheels, no battery, no plugs, empty tanks — and it will not move. This node creates the vehicle, then fits the exact parts that model needs and fills its fluids, so what appears is ready to go.

The recipe is per model, because DayZ's vehicles do not share one. The petrol cars — Olga, Ada, Sarka and Gunter — get four wheels, a CarBattery, a SparkPlug and a CarRadiator, and their coolant is filled. The 4x4 is a diesel: it takes a GlowPlug and has no radiator, so no coolant. The M3S truck takes only a TruckBattery, and gets six wheels in two different sizes. Vanilla keeps a spare of each part in the boot; this fits one of each, which is all a car needs to run.

The vehicle drops onto the terrain surface, so the height in Position does not have to be right.

When to use it

Any time a drivable car should appear: a reward for an event, a rescue vehicle, a starter car at a trader, restocking a garage. Spawn Static Object is for scenery you cannot drive, and Spawn Item for loose loot.

To top a vehicle up later use Refuel Vehicle; to start its engine from a graph use Vehicle Engine.

Pins

Position — where it lands. It settles onto the ground, so only the map coordinates really matter. Leave room: cars are large, and one spawned inside a building or another car will fight the physics.

Fuel % — 0 to 100, a percentage of that model's own tank. This is a percentage, unlike Get Vehicle Fuel, which reports the level as 0 to 1. Oil and brake fluid are always filled completely regardless.

Vehicle — the car that was created, ready for Refuel Vehicle, Set Entity Direction or Remember Item. It comes back empty if creation failed, so check with Is Valid before using it.

Vehicle (panel) — the model to spawn, picked from a list of the vanilla cars this node knows the parts recipe for, including their colour variants.

Example

A garage that restocks itself each in-game morning without stacking up cars. Daily At Time (Hour 5, Minute 0) → Sequence.

Then 0 clears yesterday's: Get Remembered Item ("garageCar") → Is ValidBranch → True path → Delete Entity. Then 1 puts the new one out: Spawn Vehicle (Hatchback_02, Position the garage bay, Fuel % 40) → Remember Item ("garageCar") wired from the Vehicle output → Broadcast Chat Message ("A car has been left at the garage").

Remembering the car is what makes tomorrow's clean-up possible — Delete Items In Radius deliberately spares vehicles, so a spawner with no memory of what it made just keeps adding to the pile. The part-full tank is deliberate too: it makes fuel matter and gives your jerrycan loot a job.

Watch out

  • Doors, the bonnet and the boot lid are not fitted. The engine runs fine

without them and players can add panels they find, but the car looks stripped when it appears — that is expected, not a bug.

straight into the other gives you a car with 1% of a tank.

  • Spawn cars away from other objects. There is no clearance check, and a car

overlapping a wall or another vehicle can be thrown across the map by the physics the moment it wakes up.

  • The Vehicle output is a live handle, not a lasting record. Across a

Delay it does not survive at all — stash it with Remember Item first if a later step needs it.

either — it clears dropped items and leaves vehicles alone. A repeating spawner needs Remember Item and Delete Entity, or you will find forty Olgas in one field after a week.

Unflip Vehicle

actionserveraction.unflipVehicle

Flips a rolled-over vehicle back upright and lifts it slightly so it settles. Keeps the direction it was facing. The lift lets physics drop it onto its wheels instead of clipping the ground.

Inputs
(exec)exec
Vehicleentity
Lift (m)floatoptional
Outputs
(exec)exec

Rights a vehicle that has rolled onto its roof or its side. It keeps the direction the vehicle was facing and flattens everything else — pitch and roll both go to zero — then lifts it by the Lift amount so physics can drop it back down onto its wheels instead of leaving it clipped into the ground. Finally it tells the clients about the move, so the car appears where it now is rather than where it was.

The lift is the part that matters. Set the orientation without it and the vehicle's roof, which was underground a moment ago, becomes the underside — the car ends up half-buried and either sticks fast or gets launched. Half a metre of clearance is usually enough; a truck on a steep slope may want more.

When to use it

Giving players a way to recover their own vehicles instead of opening a support ticket: a key they can press from the driver's seat, or an admin tool. The levelling itself is not car-specific — anything the Vehicle pin accepts gets its pitch and roll zeroed the same way — but that pin takes an entity, so a loose world object cannot be fed to it, and only transports are re-synchronised to other players afterwards.

For turning something to face a direction you choose rather than just levelling it, use Set Entity Direction — that one takes a plain object, so it accepts sources this node cannot.

Pins

Vehicle — the thing to right, and it has to arrive as an entity: Get Player Vehicle, the Vehicle handed out by On Player Entered Vehicle or On Vehicle Engine Started, or one you stashed with Remember Item when Spawn Vehicle made it and read back with Get Remembered Item. The Object from For Each Object Near and an interaction's Target are plain objects, and this pin will not take them.

Lift (m) — how far to raise it before letting go, 0 to 5 metres. Default 0.5. Too little and it clips the terrain; too much and it drops hard enough to take damage.

Example

Self-recovery from the driver's seat. The player rolls the car, is still sitting in it, and presses a bound key to put it back on its wheels.

On Key Pressed (Name In Controls "Unflip vehicle", Default Key KC_F7) → Branch, with the Condition from Is Valid on Get Player Vehicle (Player from the event) → the True path runs Unflip Vehicle (Vehicle from that same Get Player Vehicle, Lift 0.6) → Send Notification ("Vehicle righted", "Give it a moment to settle").

Get Player Vehicle comes back empty on foot, so the Is Valid check is what keeps the key from doing — and announcing — anything away from a car. Pick the Lift for the biggest thing players drive: 0.6 settles a Hatchback_02, while a Truck_01_Covered wants nearer 1.2 because it is taller.

Watch out

  • You cannot hang this off an interaction on the car. The Target of

On Hold Interaction and On Press Interaction is a plain object and the Vehicle pin is an entity, so the editor refuses the wire — and As Item does not bridge it either: a car is a transport, not an inventory item, so that cast comes back empty and nothing happens. Trigger it from something that already hands you the vehicle instead.

  • A keybind is read on the player's own machine, so a mod built this way has to

be installed on players' clients as well as the server; the unflip itself then runs on the server, which NodeZ arranges for you. On a server-only install there is no key to press.

  • Everyone in the seats is moved with the car. That is what the driver asked

for; a passenger did not, and an unexpected lift can hurt or desync them. Keep the Lift small, and when the trigger is not the person sitting in the car — one you stashed with Remember Item when you spawned it, say — Is Player In Vehicle tells you whether a player is aboard first.

  • It levels the vehicle relative to the world, not to the hill it is on, so on

a slope it will slide or roll a little after settling. That is the physics doing its job.

  • Only vehicles and other transports are re-synchronised to clients. Righting

something else the pin accepts — a dropped crate, say — works on the server, but other players may not see it move until something else refreshes it.

  • A big Lift is not a stronger fix. Beyond a metre or so you are dropping the

vehicle, and the fall damages it.

Vehicle Engine

actionserveraction.vehicleEngine

Starts or stops a vehicle's engine.

Inputs
(exec)exec
Vehicleentity
Outputs
(exec)exec
Settings
Actionselect · Start | Stop · default "Start"required

Turns a vehicle's ignition from the server. The Action prop picks Start or Stop, and the node calls the engine's own start or stop, exactly as if the driver had done it.

It asks, it does not force. Starting still depends on the car being in a state where it can run — a battery, a spark or glow plug, and fuel in the tank. A car missing any of those may turn over and cut out again straight away, and this node will not tell you; it fits no parts and pours no fuel. Anything that is not a vehicle is ignored entirely.

When to use it

Killing an engine as a punishment or a control — stopping cars inside a safezone, cutting the engine on a restrained driver, shutting a vehicle down at the end of an event. Starting is rarer, but useful for a "hotwired" reward or a scripted convoy.

Check the current state with Is Engine Running first when it matters, and read who is driving with On Player Entered Vehicle. To make a car startable rather than just start it, use Refuel Vehicle or spawn it complete with Spawn Vehicle.

Pins

Vehicle — the car. From Get Player Vehicle, from the Vehicle pin of On Player Entered Vehicle or On Vehicle Engine Started, or from Spawn Vehicle.

Example

A no-driving safezone. While Player In Zone (Position the trader, Radius 60, Interval 3) → Get Player Vehicle on the event's Player → Is ValidBranch → True path → Vehicle Engine (Action "Stop") → Send Notification ("Safe zone", "Engines are disabled here", 5 seconds).

The zone re-checks every three seconds, so somebody who restarts the engine to sneak through is cut out again almost immediately. Players on foot never reach the branch, so nobody gets a pointless notification.

Watch out

the engine starting, including when this node starts it, and the two feed each other.

  • Starting is a request. A car with no battery, no plug or an empty tank will

not stay running, and nothing here reports the failure — check with Is Engine Running a moment later if the outcome matters.

  • Server-side only, like all vehicle nodes. A keybind or HUD graph can trigger

it, but the work happens on the server.

  • An empty or non-vehicle Vehicle pin does nothing at all, silently. Guard

lookups with Is Valid.

Actions/World

Attach Item To Item

actionserveraction.attachItemTo

Attaches an item onto another item — an optic on a rifle, a pouch on a vest. Attach To takes the item another node made: the Weapon from Give Weapon, or the Item from Equip Item On Player. The slot comes from the item being attached, so it lands wherever it belongs. Nothing happens if the class is empty or the target has no room for it.

Inputs
(exec)exec
Attach Toentity
Item Classstringoptional
Outputs
(exec)exec
Itemitem
Settings
Item ClassclassnamePickerrequired

Creates a new item and bolts it onto another item's attachment slot — an optic on a rifle, a pouch on a plate carrier, a battery in a torch. You never name the slot: the item being attached declares in its own config where it belongs, and the engine finds a free matching slot on the target.

The Attach To pin takes a live item another node made, not a classname. This is the node for the second layer of a loadout — the things that hang off the things you just handed out. It is also the forgiving member of the attach family: both the target and the classname are checked before anything happens, so an empty wire or a blank config slot skips quietly instead of erroring.

When to use it

Chaining off another node's output: the Weapon from Give Weapon, the Item from Equip Item On Player or Give Item To Player, the Item from Spawn Item. Attach New Item does the same job without those guards, so prefer this one whenever the target or the class can come up empty.

Two nodes are easy to reach for by mistake. Attach Existing Item moves an attachment that already exists in the world rather than creating one. And Put Item Into Item is for cargo, not slots — a scope goes in a slot, a spare magazine goes in cargo, and the two are different places.

Pins

Attach To — the target item. Item, entity and player wires all fit here.

Item Class — the picker, or a wired text pin that overrides it.

Item — the attachment that was created. Chain another Attach Item To Item onto it to nest a third layer, or check it with Is Valid to see whether the attach actually landed.

Example

A rifle beyond Give Weapon's two attachment slots: On Player ReadyGive Weapon (M4A1, Mag_STANAG_30Rnd, M4_RISHndgrd) → Attach Item To Item (Attach To = the Weapon output, Item Class M4_Suppressor) → Attach Item To Item (Attach To = the same Weapon output, Item Class ACOGOptic). Both attach nodes point at the gun, not at each other.

Nesting one level deeper: Equip Item On Player (PlateCarrierVest) → Attach Item To Item (Attach To = the vest's Item output, Item Class PlateCarrierPouches) → Put Item Into Item (Into = the pouches' Item output, Item Class BandageDressing). The vest is worn, the pouches hang off the vest, and the bandage sits inside the pouches.

Watch out

  • Classnames are case-sensitive: ACOGOptic, not acogoptic. A wrong-case name

attaches nothing and reports nothing.

  • If the target has no matching slot, or the slot is already full, nothing

happens and the Item output comes back empty. Check it with Is Valid when the rest of the chain depends on the attachment existing.

  • Attach To must be the output of the node that made the target, wired

directly. After a Delay the only value carried across is the player, so a target from before the wait is gone — do the attaching before any delay.

  • Do not attach in the same instant as a teleport: items created while the

engine is rebuilding the player for other clients never reach them. Wait about 2 s after Teleport Player and follow with Resync Player Gear.

Delete Entity

actionserveraction.deleteEntity

Removes an object, item, or creature from the world.

Inputs
(exec)exec
Entityentity
Outputs
(exec)exec

Removes one thing from the world immediately — an item, a creature, a vehicle, anything with an entity wire. There is no animation and nothing is dropped: the object stops existing for every client at once. The wire is checked first, so an Entity that came up empty is a quiet no-op rather than an error.

When to use it

Cleaning up after an event, consuming a quest item once it has been handed in, despawning the creatures you spawned. When you want to clear a whole area without wiring each object, Delete Items In Radius does it in one node. To take an item off a player and leave it on the floor rather than destroy it, Drop Item To Ground. To strip one classname out of an inventory, Remove Items Of Type.

People are handled elsewhere: Kill Player and Kick Player.

Pins

Entity — an entity wire. The Item from Spawn Item or Give Item To Player, the Creature from Spawn Infected or Animal, a vehicle from Get Player Vehicle. A plain object wire — what For Each Object Near hands you — does not fit here directly; run it through As Item first.

Example

Clearing your own event loot and nothing else: Every N Seconds (3600) → For Each Object Near (Position 7500 0 7500, Radius 60) → As Item on the loop's Object → Branch on Text Equals comparing Get Item Tag against "airdrop" → Delete Entity. Everything a player brought into the circle survives; only the items you tagged when you spawned them are removed.

Watch out

  • Once it is deleted the wire is dead. Anything that reads the entity's

position, health or tag must run before the delete, not after.

you every object in range — buildings, trees and other players' gear included. Gate on a tag (Get Item Tag) or a class check (Is Item Of Type) before this node, never delete everything the loop offers.

  • As Item comes back empty for anything that is not an item, so a

building or a tree from a loop will not reach this node through it. That also means objects from Spawn Static Object cannot be deleted this way — those are built to persist.

  • After a Delay the only value carried over is the player, so an

entity wire from before the wait is gone. Delete before the wait, or hold the item with Remember Item — which reads back empty once the item is destroyed anyway.

Delete Items In Radius

actionserveraction.deleteItemsInRadius

Deletes only the dropped items within a radius. Leaves players, creatures, vehicles, and buildings untouched.

Inputs
(exec)exec
Positionvector
Radius (m)float
Outputs
(exec)exec

Sweeps a sphere around a position and removes every loose item inside it. The engine returns everything in range; the node keeps only the objects that are items and deletes those, so players, infected, animals, vehicles and buildings are left standing. The engine also hands back the container cargo it found in range — the node ignores that list and touches only the objects themselves.

It is a blunt instrument, and that is the point: one node, one radius, area clear.

When to use it

Resetting an arena between rounds, tidying a trader zone, clearing the ground after an event so the next one starts clean.

When you need to be selective — only your own drops, only one classname — loop instead: For Each Object Near with a Get Item Tag or Is Item Of Type check feeding Delete Entity. For one player's inventory this is the wrong tool entirely; use Clear Inventory or Remove Items Of Type.

Its opposite number is Extend Loot Lifetime In Radius, which keeps loot in an area alive longer instead of removing it.

Pins

Position — the centre of the sphere. Height matters (see below), so a value from Snap To Ground or a coordinate you measured in game beats a guess.

Radius (m) — how far the sweep reaches, in every direction.

Example

An arena that resets itself on a timer, with warning: Every N Seconds (600) → Broadcast Notification ("Arena resets in 10 seconds") → Delay (10 seconds) → Delete Items In Radius (Position 7500 0 7500, Radius 120) → Broadcast Chat Message ("Arena clear").

A tidier version that only clears your own drops replaces the delete with the tagged loop described above — worth the extra nodes wherever players might have gear on the ground.

Watch out

  • It does not ask where an item came from. Everything loose in range goes,

including gear a player dropped seconds ago and the contents of a stash left inside the circle. Keep the radius tight and site these sweeps well away from where people store things.

  • It is a sphere, not a column. A radius of 50 reaches 50 m up and 50 m down as

well as sideways, so a whole multi-storey building is covered — and a centre placed on a hilltop can miss the valley floor entirely.

  • Items from Spawn Item are ordinary items and go with everything

else. If your own drops must survive a sweep, do the tagged loop instead.

  • The sweep costs more the bigger the radius, because the engine has to gather

every object in range first. A radius of a few hundred metres on a short timer is not free — prefer a modest radius on a slow timer.

Equip Item On Player

actionserveraction.equipItem

Puts an item ON the player — worn in its own slot rather than dropped in their bags. The slot comes from the item itself, so a helmet goes on the head and boots on the feet; one node covers every slot from headgear to armband. Give Item To Player is the other half: that one fills pockets. Equip the clothes FIRST, then give the items, or the items have no pockets to go in. An empty Item Class equips nothing, so an unused slot in a config needs no check.

Inputs
(exec)exec
Playerplayer
Item Classstringoptional
Outputs
(exec)exec
Itemitem
Settings
Item ClassclassnamePickerrequired

Puts an item on the player — worn in a slot, not dropped in their bags. It rides the same attachment call vanilla's character spawner uses to dress a fresh survivor.

You never name the slot. The item's own config says where it belongs, so a helmet goes on the head, boots on the feet, a backpack on the back and an armband on the arm, all from this one node. If the slot is already occupied nothing happens, and an empty Item Class equips nothing — which means an unused slot in a config can be wired straight in with no check around it.

When to use it

Clothing and anything worn. Give Item To Player is the other half of the pair: that one fills pockets. Run the equips first and the gives second — pockets only exist once the clothes and bag are on.

For hanging something onto an item rather than onto the player — a pouch on the vest you just equipped, an optic on a rifle — use Attach Item To Item with this node's Item output as the target. For an item that already exists somewhere in the world, Attach Existing Item moves it instead of creating a new one. For a working firearm in the hands, Give Weapon.

Pins

Item Class — the panel picker, or a wired text pin that overrides it. Wire it from Get Config Text so server owners can change a uniform without opening the editor.

Item — the item now being worn. This is the handle you need for the second layer of a loadout: feed it to Put Item Into Item to fill the backpack, or Attach Item To Item to hang pouches on the vest. Empty if the classname was wrong — check with Is Valid.

Example

A full kit in one chain: On Player ReadyClear InventoryEquip Item On Player (TShirt_White) → Equip Item On Player (Jeans_Blue) → Equip Item On Player (MilitaryBoots_Black) → Equip Item On Player (PlateCarrierVest) → Equip Item On Player (MountainBag_Blue) → Put Item Into Item (Into wired from the backpack node's Item output, Item Class Mag_STANAG_30Rnd) → Give Weapon (M4A1, Mag_STANAG_30Rnd).

Wiring the backpack's Item output into the Put node is what makes the spare magazine land in the bag rather than "wherever it fitted".

Watch out

  • Classnames are case-sensitive: PlateCarrierVest, not platecarriervest. A

wrong-case name equips nothing and says nothing.

  • An occupied slot is skipped silently. A player who respawned in their own

clothes keeps them and your uniform is quietly dropped — run Clear Inventory first when the loadout must be exact.

  • Equip before you give. Giving items to a player with no storage means most of

the kit ends up on the ground.

  • Do not equip in the same instant as a teleport. The engine is rebuilding the

player for other clients and the new clothes never reach them, so everyone else sees a naked survivor. Wait about 2 s with Delay after Teleport Player and finish with Resync Player Gear.

  • The Player wire must be real. Straight from an event pin it always is; from

Get Player By Name or Get Player By Steam ID it can be empty, so gate on Is Valid first.

Extend Loot Lifetime In Radius

actionserveraction.preventDespawnInRadius

Stops the game from cleaning up dropped items in an area for longer (or resets them to normal). Great for keeping event loot or a base area from being wiped by the cleanup system.

Inputs
(exec)exec
Positionvector
Radius (m)float
Extra Secondsfloatoptional
Outputs
(exec)exec
Settings
Modeselect · Extend Lifetime | Reset To Default · default "Extend Lifetime"required

DayZ's central economy quietly removes dropped loot once its lifetime runs out — that is why the pile of gear you left in a field is gone next week. This node reaches into that cleanup system and pushes the timer out for everything inside a radius, or, in Reset To Default mode, puts the area back to normal.

It speaks to the central economy directly. Where there is no central economy running — some server setups do without it, and it is not ready in the first moments of start-up — the node quietly does nothing at all.

When to use it

Keeping event loot alive until the event finishes, protecting a base or trader area from the cleanup sweep, giving an airdrop a longer window before it evaporates.

It works on what is lying in the radius at the moment it runs, so put it after whatever placed the loot. Items from Spawn Item already sit outside the cleanup timer and do not need this — it is for loot the economy owns.

The opposite node is Delete Items In Radius, which removes loose loot rather than preserving it.

Pins

Mode — "Extend Lifetime" hands the economy the Extra Seconds; "Reset To Default" clears whatever you added and returns the area to ordinary lifetimes. Extra Seconds is ignored in reset mode.

Position and Radius (m) — the sphere to work on. Wire them from Get Config Position and Get Config Number so a server owner can move or resize the protected area without opening the editor.

Extra Seconds — how much lifetime to add, in seconds. 3600 is an hour.

Example

A protected base area, topped up on a slow timer: Every N Seconds (1800) → Extend Loot Lifetime In Radius (Position 7500 0 7500, Radius 100, Extra Seconds 3600, Mode "Extend Lifetime"). Anything dropped inside that circle in the last half hour gets another hour before the cleanup system can take it.

Winding it back down at the end of an event: Daily At Time (23:00) → Extend Loot Lifetime In Radius on exactly the same Position and Radius with Mode "Reset To Default", so the area returns to normal overnight instead of accumulating forever.

Watch out

  • Silent where there is no central economy, including the first seconds of

start-up. If a call from On Server Started seems to do nothing, move it onto After Delay On Start with a delay of 30 s or so and give the economy time to boot.

  • It affects what is in the radius right now. Loot dropped a minute later is

untouched — that is why the example runs on a repeating timer rather than once.

  • It is a sphere, not a column: the radius reaches as far up and down as it does

sideways.

  • Reset To Default clears the whole radius, including extensions another part of

your graph made. Where two protected areas overlap, match their centres and radii carefully or one reset will undo the other.

  • Extending lifetimes broadly defeats the cleanup system your server relies on

to stay healthy. Keep the radius to the area that genuinely needs it.

Get Server Date & Time

actionserveraction.getServerDateTime

Reads the current in-game date and time as separate numbers.

Inputs
(exec)exec
Outputs
(exec)exec
Yearint
Monthint
Dayint
Hourint
Minuteint

Reads the in-game world clock and hands back its five parts as separate numbers: year, month, day, hour and minute. It is the same date the sky is drawn from, not the real-world clock on the machine hosting the server.

It sits among the actions rather than the value nodes because it fills five outputs in one call, so it needs an exec wire to say when to read.

When to use it

Anywhere you want the date as well as the time — a log line stamped with the in-game day, a message that names the month, an event that only runs on certain days. When all you need is the hour, Get In-Game Time gives it as a decimal with no exec wire at all (13.5 means half past one in the afternoon), and Is Night Time answers the usual question directly. For the real-world clock, ready-formatted for a log file, use Get Date & Time Text.

Pins

Hour and Minute are whole numbers on a 24-hour clock. Year, Month and Day are the world date, which advances with the in-game day cycle from whatever the mission sets at boot — it is a game calendar, not yours.

Example

An hourly heartbeat in the server log: Every N Seconds (3600) → Get Server Date & TimeJoin Text ("In-game hour: " plus the Hour output) → Log Message.

A night-only reward, without touching the clock: On Player ReadyGet Server Date & TimeBranch on Greater Than (Hour, 20) → Give Item To Player (Chemlight_White).

Watch out

  • This is the game clock, not the real one. A log line stamped with it tells you

nothing about when something actually happened in real time — use Get Date & Time Text for that.

  • The in-game clock runs at the server's time multiplier, so an hour of movement

in the Hour output is not an hour of real time. See Set Time Acceleration.

  • The values are a snapshot from the moment the exec wire fires. Read them again

rather than carrying them across a Delay — after a wait, only the player carries over anyway.

  • Hour here is a whole number, so 13 covers everything from 13:00 to 13:59. Use

Minute alongside it, or Get In-Game Time, when you need finer than that.

Give Item To Player

actionserveraction.giveItem

Puts an item into a player's inventory. If their inventory is full, the item drops on the ground next to them. An empty Item Class gives nothing at all — so a slot left blank in a config can be wired straight in without a check around it.

Inputs
(exec)exec
Playerplayer
Item Classstringoptional
Outputs
(exec)exec
Itemitem
Settings
Item ClassclassnamePickerrequired

Creates a brand-new item and puts it straight into a player's inventory — pockets, vest, backpack, wherever the engine finds a free space. This is the same inventory call vanilla uses to kit out a fresh character at spawn.

Two things make it forgiving. If nothing the player is wearing has room, the item is spawned on the ground at their feet instead of being lost — so a give never silently fails, it just may not land where you expect. And an empty Item Class does nothing at all: no error, no item. That is deliberate, and it is what lets a config-driven kit leave a slot blank and wire it straight in without a branch around it.

When to use it

Rewards, starting kits, restocking someone mid-round. The siblings split by where the item ends up: Equip Item On Player wears it in its own slot (shirt, boots, backpack), Give Weapon builds a loaded gun in the hands, Spawn Item puts it on the ground at a map position, and Put Item Into Item or Spawn Item In Cargo place it inside one specific container rather than "anywhere it fits".

Order matters when you are building a loadout. Equip the clothes first, then give the items — a survivor with no shirt and no bag has almost no pockets, so everything you hand them lands on the floor.

Pins

Item Class — the panel's classname picker, or a wired text pin that overrides it. Wiring it from Get Setting or Random Config Text is how one graph serves any number of kits.

Item — the item that was created. Feed it to Tag Item, Set Item Quantity, Set Item Health or Set Quick Bar Slot. It comes back empty when the classname was wrong, so check with Is Valid if anything downstream depends on it.

Example

The Kill reward template (File → New from template) is this node at its simplest: On Player DiedIs Valid on the Killer → BranchGive Item To Player (Player = Killer, Item Class Rag) → Send Notification. The Is Valid guard is there because a fall or a bleed-out leaves the Killer empty.

A care package built in an empty project: On Player ReadyEquip Item On Player (MountainBag_Blue) → Give Item To Player (BandageDressing) → Give Item To Player (TunaCan) → Give Item To Player (WaterBottle), all chained exec to exec. The backpack goes on first so the other three have somewhere to go.

Watch out

  • Classnames are case-sensitive and exact: BandageDressing, not

bandagedressing. A wrong-case name gives nothing, the Item output comes back empty, and nothing is reported.

  • A full inventory means the item lands on the ground beside the player. On a

server where people spawn with gear, a "reward" can quietly end up in the grass — clear space first, or equip storage before giving.

  • Never give items in the same instant as a teleport. The engine is rebuilding

the player for other clients and the new items never reach them, so the player looks naked to everyone else. Wait about 2 s with Delay after Teleport Player, and run Resync Player Gear as a backstop.

  • After a Delay the only value carried across is the player. The Item

output from before the wait is gone — re-find it with Find Item On Player, or do everything to it before the wait.

slot empty, because the client has not received the item yet. Put a couple of seconds between the give and the quick-bar assignment.

Put Item Into Item

actionserveraction.putItemInto

Puts an item inside another item's cargo — ammo into the backpack you just gave, not wherever it happens to fit. Into takes the item another node made (the Item output of Equip Item On Player or Give Item To Player). Nothing happens if the class is empty, the target is gone, or it has no room left.

Inputs
(exec)exec
Intoentity
Item Classstringoptional
Outputs
(exec)exec
Itemitem
Settings
Item ClassclassnamePickerrequired

Creates a new item inside another item's cargo — the grid you see when you open a backpack, tent, crate or barrel. Not "somewhere on the player": exactly inside the thing you point at.

Everything is checked before anything is created. A blank classname, a container wire that came up empty, or a container with no room left all mean the node quietly does nothing. That is what lets a config-driven kit list a container's contents with blank entries and wire them straight in.

When to use it

Filling a container you just made or just gave someone: ammo into the backpack from Equip Item On Player, supplies into a crate from Spawn Item. Spawn Item In Cargo does the same job without the guards. Move Item Into Container moves an item that already exists instead of creating one.

The near miss is Attach Item To Item. Slots and cargo are different places: an optic goes into a slot on a rifle, a spare magazine goes into cargo. And if "anywhere on the player that fits" is good enough, Give Item To Player is simpler.

Pins

Into — the container item, taken from the Item output of whichever node created it. Item, entity and player wires all fit.

Item Class — the picker, or a wired text pin that overrides it. Wire it from Get Config Text At to fill a crate from a config list with For Each Config Text.

Item — the item now sitting in the cargo. Empty when it did not fit or the classname was wrong; check with Is Valid if the rest of the chain cares.

Example

A stocked supply crate that rebuilds itself on every boot: On Server StartedSpawn Item (WoodenCrate, Position 7500 0 7500) → Put Item Into Item (Into = the crate's Item output, Item Class Mag_STANAG_30Rnd) → Put Item Into Item (Into = the same crate output, Item Class BandageDressing) → Put Item Into Item (Into = the same crate output, Item Class TunaCan). All three Put nodes point at the crate, chained exec to exec.

The loadout version: On Player ReadyEquip Item On Player (MountainBag_Blue) → Put Item Into Item (Into = the backpack's Item output, Item Class Mag_AKM_30Rnd) → Put Item Into Item (same target, Item Class Rag). The ammo is in the bag rather than wherever the engine felt like putting it.

Watch out

  • Classnames are case-sensitive: Mag_STANAG_30Rnd exactly. A wrong-case name

puts nothing anywhere and says nothing.

  • Cargo, not slots. A rifle has attachment slots and no cargo; pointing this

node at one achieves nothing. That job belongs to Attach Item To Item.

  • A full container is a silent no-op, and cargo fills up faster than people

expect because item sizes differ. Check the Item output with Is Valid when the container must actually end up stocked.

  • Into must be the live output of the node that made the container. After a

Delay only the player carries across, so that wire is gone. Fill the container before any wait, or stash it with Remember Item — remembering that is a weak handle which reads back empty once the item is destroyed.

  • Filling a container on a player in the same instant as a teleport hits the

same desync as any other item creation: wait about 2 s after Teleport Player and finish with Resync Player Gear.

Set Entity Direction

actionserveraction.setEntityOrientation

Turns an object, creature, or vehicle to face a compass direction (0-360°).

Inputs
(exec)exec
Objectobject
Yaw (degrees)float
Outputs
(exec)exec

Turns an object to face a compass heading. One number, in degrees: 0 is north, 90 east, 180 south, 270 west. Only the heading changes — nothing is tilted, rolled or moved. The wire is checked first, so an empty Object is a quiet no-op.

When to use it

Lining up something that arrived facing the wrong way. Spawn Static Object already takes a Yaw of its own, so reach for this node when the thing came from somewhere else: a car from Spawn Vehicle, a creature from Spawn Infected or Animal, an item from Spawn Item, or an object out of a For Each Object Near loop.

For a player's facing, this is the wrong node — Set Player Direction handles people. And a car lying on its roof is not an orientation problem: Unflip Vehicle rights it properly, while turning the heading just gives you an upside-down car pointing a different way.

Pins

Object — any world object. Item, entity and player wires all fit, so the outputs of the spawn nodes go straight in.

Yaw (degrees) — the heading, 0-360.

Example

Three cars in a clearing, all parked facing east: On Server StartedRepeat (Times = 3) → Spawn Vehicle (Hatchback_02, Position from Random Point Near with Center 7500 0 7500 and Radius 15) → Set Entity Direction (Object = the Vehicle output, Yaw 90). Without the last node each car keeps whatever heading the spawn happened to give it.

Watch out

  • Yaw only. Pitch and roll are left alone, so this cannot stand something back

up — it can only spin it about the vertical axis.

  • It does not move the object. Position and orientation are separate; turn a

long object and it pivots about its own origin, which may not be its centre.

  • The Object wire must be live. From a spawn node's output in the same chain it

always is; after a Delay only the player carries across, so the wire is gone by then.

Set Thunderstorm

actionserveraction.setStorm

Starts a thunderstorm (lightning + thunder) across the server.

Inputs
(exec)exec
Density (0-1)float
Overcast Thresholdfloatoptional
Seconds Between Strikesfloatoptional
Outputs
(exec)exec

Switches on lightning and thunder across the server. Three numbers control it: how intense the storm is, how cloudy the sky must be before lightning is allowed at all, and roughly how many seconds pass between strikes.

The threshold is the one that catches everybody. The engine only fires lightning while overcast sits at or above it, so a storm set with a threshold of 0.7 under a clear sky does nothing whatsoever — no error, no strikes, just silence. Storms are a two-node job: cloud first, lightning second.

When to use it

Drama for an event, a nightly storm, atmosphere over a contested area. Cloud, rain, fog and snow are Set Weather; wind is Set Wind Speed. A storm on its own, with none of those, looks like lightning out of nowhere.

Pins

Density (0-1) — how heavy the storm is. Run the node again with Density 0 to turn it off.

Overcast Threshold — the overcast level lightning needs before it will fire. Compare it against what Get Weather Level (Type Overcast) reports for your server before picking a number.

Seconds Between Strikes — roughly how often lightning fires.

Example

A storm that builds properly: Daily At Time (21:00) → Set Weather (Type Overcast, Amount 0.9, Over Seconds 300) → Delay (300 seconds) → Set Thunderstorm (Density 1, Overcast Threshold 0.8, Seconds Between Strikes 15) → Broadcast Chat Message ("Storm overhead — stay off the ridgelines").

The five-minute delay is doing real work: it gives the overcast time to climb past 0.8 before the storm is armed. Fire the storm immediately after the weather node and the sky is still clear when the threshold is checked.

Ending it: Daily At Time (23:00) → Set Thunderstorm (Density 0) → Set Weather (Type Overcast, Amount 0.2, Over Seconds 600).

Watch out

  • Overcast below the threshold means no lightning at all, and nothing tells you.

This is by far the most common reason a storm node "does not work" — raise overcast with Set Weather first and wait for it to arrive.

  • Set Weather's Over Seconds is not a wait, so a storm wired straight

after it fires against the old sky. Put a Delay between them.

  • The weather system keeps running on its own. If overcast drifts back below

your threshold the storm goes quiet by itself — re-apply on a timer with Every N Seconds if it must last.

  • One sky for the whole server. There is no way to storm over one zone only.

Set Time Acceleration

actionserveraction.setTimeAcceleration

Speeds up or slows the day/night cycle (1 = normal, higher = faster). Use -1 to reset back to the server config default.

Inputs
(exec)exec
Multiplierfloat
Outputs
(exec)exec

Changes how fast the in-game day runs. 1 is normal — one in-game second per real second. 8 makes a full day and night pass in three real hours. Values near 0 make the sun crawl, which is how you hold a permanent afternoon without jumping the clock every few minutes.

The value -1 is special: it is the reset, putting the server back on the acceleration from its own config file rather than running time backwards.

When to use it

Long nights on a night-focused server, a fast cycle so short sessions see both day and dark, freezing the light for a screenshot event. To move the clock to a specific time instead of changing its speed, use Set Time Of Day. To read where the clock currently is, Get In-Game Time.

Pins

Multiplier — 1 is normal, higher is faster, near 0 is nearly frozen, -1 resets to the server's configured value. Wire it from Get Config Number so a server owner can tune the cycle without opening the editor.

Example

A slow night and a quick day: Daily At Time (20:00) → Set Time Acceleration (0.5) and Daily At Time (06:00) → Set Time Acceleration (4). Nights last twice as long in real terms and the daylight hours pass in a quarter of the time.

Holding an afternoon for a scheduled event: Daily At Time (14:00) → Set Time Acceleration (0.1) → Delay (3600 seconds) → Set Time Acceleration (-1). The light barely moves for an hour of real time, then the server goes back to its normal cycle.

Watch out

  • -1 is the reset value, not "run backwards". There is no reverse.
  • The setting is not saved. After a restart the server is back on the

acceleration in its own config, so re-apply it from On Server Started if it should always be in force.

real seconds whatever the multiplier is. Daily At Time watches the in-game clock, so a high multiplier makes it fire more often in real time — four times an hour at a multiplier of 24, not once a day.

  • One clock for the whole server, and every player sees the change.

Set Time Of Day

actionserveraction.setTimeOfDay

Sets the in-game time of day for the whole server.

Inputs
(exec)exec
Hour (0-23)int
Minute (0-59)intoptional
Outputs
(exec)exec

Moves the in-game clock to an hour and minute you choose, for everyone on the server at once. The node reads the current world date first and puts it straight back, so only the time changes — the day, month and year stay exactly where they were.

The clock does not stop once you have set it. It carries on running from the new time at whatever speed the server is configured for, so this is a jump, not a freeze.

When to use it

Forcing daylight for an event, dropping the server into night for a raid window, resetting the morning after a scheduled restart. To read the time rather than set it, use Get In-Game Time, Is Night Time or Get Server Date & Time. To make something happen at a time rather than change the time, Daily At Time is the node you want.

Pins

Hour (0-23) and Minute (0-59) — 24-hour clock. 0:00 is midnight, 12:00 is noon. Wire them from Get Config Number to let a server owner pick the time without opening the editor.

Example

Permanent daylight, held by re-applying it: Every N Seconds (600) → Set Time Of Day (Hour 10, Minute 0). Every ten minutes the clock snaps back to mid- morning, so the sun never really moves. The cleaner way to do the same job is Set Time Acceleration with a very low multiplier — one node, no repeated jumps.

A scripted night event: Daily At Time (20:00) → Set Time Of Day (Hour 23, Minute 0) → Broadcast Notification ("Night falls early tonight").

Watch out

  • Everyone sees it. The sky jumps for every connected player at the same moment

— there is no per-player time.

  • The clock keeps running afterwards at the server's time multiplier, so a time

you set will drift away from it. Hold it either by re-applying on a timer, or by slowing the clock with Set Time Acceleration.

  • Only the hour and minute change. Setting an earlier hour does not roll the

date back a day; you simply land earlier on the same in-game date.

count real seconds no matter what you do to the clock, while Daily At Time watches the in-game clock and can be made to fire by a jump across its hour.

Set Weather

actionserveraction.setWeather

Changes the weather across the whole server. Amount goes from 0 (clear) to 1 (full). Rain only falls when overcast is high.

Inputs
(exec)exec
Amount (0-1)float
Over Secondsfloatoptional
Outputs
(exec)exec
Settings
Typeselect · Overcast | Rain | Fog | Snow · default "Overcast"required

Moves one weather phenomenon towards a target value over a stretch of time. The Type prop picks which one — Overcast, Rain, Fog or Snow — and each is its own independent number from 0 (none) to 1 (full). Over Seconds is how long the journey takes: 0 snaps instantly, 300 eases in over five minutes, which is what makes a front look like weather rather than a switch being flipped.

Rain is not independent of cloud. The engine only lets rain fall when overcast is high, so "make it rain" is always two nodes: raise the overcast first, then the rain.

When to use it

Atmosphere for an event, a front rolling in before an airdrop, clearing the sky for a night operation. To read the current value instead of setting it, use Get Weather Level. Lightning and thunder are a separate system — Set Thunderstorm. Wind is Set Wind Speed.

Pins

Amount (0-1) — the target value for the chosen Type. 0 is none, 1 is full.

Over Seconds — how long the change takes. The node itself returns straight away; the sky keeps moving after it.

Example

A storm front over ten minutes: Daily At Time (20:00) → Set Weather (Type Overcast, Amount 1, Over Seconds 600) → Set Weather (Type Rain, Amount 0.8, Over Seconds 600) → Broadcast Notification ("A storm is closing in"). The overcast and rain nodes both run immediately and both ease in together over the same ten minutes.

Clearing up in the morning: Daily At Time (06:00) → Set Weather (Type Rain, Amount 0, Over Seconds 300) → Set Weather (Type Overcast, Amount 0.1, Over Seconds 300). Rain comes down first, then the cloud, so it does not rain out of a blue sky on the way.

Watch out

  • The server's own weather system keeps running underneath. Your value can drift

back over the following minutes — if a setting has to hold, re-apply it on a timer with Every N Seconds.

  • Rain with low overcast does nothing you can see. Raise overcast first, and

give it time to get there.

  • Over Seconds is not a wait. The next node in the chain runs immediately, with

the sky still where it was. Put a Delay in if a later step depends on the weather having actually arrived.

  • One sky for the whole server. There is no per-player or per-zone weather; a

"toxic fog zone" can only be a real fog change everyone sees.

  • Snow behaves differently between maps depending on how the terrain is set up.

Test it on yours before shipping a graph that relies on it.

Set Wind Speed

actionserveraction.setWindSpeed

Sets the server wind speed in metres per second.

Inputs
(exec)exec
Speed (m/s)float
Outputs
(exec)exec

Sets how hard the wind blows, in metres per second. The node raises the wind ceiling before it sets the speed, because the engine clamps wind to its configured maximum — set the speed on its own and a high value would be quietly cut back down to whatever the maximum happened to be.

When to use it

Atmosphere alongside Set Weather and Set Thunderstorm. Wind is what sells a storm: it drives the tree and grass motion and the wind audio, so a downpour with dead-calm air never quite convinces. To read the current value, Get Weather Level with Type "Wind Speed".

Pins

Speed (m/s) — metres per second, not kilometres per hour. 2 is a light breeze, 20 is a serious gale.

Example

A gale that builds over a few minutes: Daily At Time (21:00) → Set Wind Speed (5) → Delay (120 seconds) → Set Wind Speed (12) → Delay (120 seconds) → Set Wind Speed (20). Calm again in the morning: Daily At Time (07:00) → Set Wind Speed (2).

Watch out

  • The change is immediate, not gradual. Set Weather eases in over its

Over Seconds; wind snaps to the new value. Step it up through a few calls with Delay between them if you want a build-up, as in the example.

  • Each call sets the ceiling to the same value as the speed, so the ceiling

simply follows your last call — there is no separate maximum to manage, and a later low value works fine.

  • The server's own weather system also drives wind, so your value can drift back

over the following minutes. Re-apply on a timer with Every N Seconds if it has to hold.

  • One wind for the whole server, like the rest of the weather nodes.

Spawn Character

actionserveraction.spawnCharacter

Spawns a standing survivor model with no AI — a mannequin. Use a survivor class such as SurvivorM_Mirek or SurvivorF_Judy. It comes out as a Player, so every player node works on it: dress it with Give Item To Player, read it with Get Player Health, and it fires On Player Took Damage and On Player Died like anyone else. It has no identity and no controller, so it just stands there — ideal as a shooting target or a display dummy.

Inputs
(exec)exec
Positionvector
Character Classstringoptional
Outputs
(exec)exec
Characterplayer
Settings
Character ClassclassnamePickerrequired

A survivor model standing where you put it, with nobody driving it. It is a full character — it wears clothes, takes bullets, bleeds, goes unconscious and dies — but it has no identity and no controller, so it never moves or reacts. The game spawns its own placement dummies exactly this way.

The output is a Player, not an object, and that is the useful part: every player node accepts it. Dress it with Equip Item On Player, fill its pockets with Give Item To Player, read Get Player Health off it, turn it with Set Player Direction. It fires On Player Took Damage and On Player Died like any other player, so a shooting target reports its own hits with no extra machinery.

When to use it

Shooting targets and armour tests, where you want real hit zones and real damage numbers instead of guesses. Also anything decorative: a body slumped at a story location, a dressed mannequin outside a trader, a corpse for players to find.

For an infected or an animal that actually chases people, use Spawn Infected or Animal instead — that one starts the AI on purpose.

Pins

Character Class — a survivor class such as SurvivorM_Mirek or SurvivorF_Judy. It comes naked; put clothes on it yourself.

Character — the spawned model, as a Player. Empty if the classname was wrong, so check it with Is Valid before dressing it.

Example

A target that reports what you hit it with: On Mission StartSpawn Character (SurvivorM_Mirek, at your range) → Equip Item On Player for each piece of armour → Set Player Number on it (name is_target, value 1).

Then On Player Took DamageBranch on Get Player Number (is_target) → Send Chat Message to the Attacker with the Hit Zone, Damage and Shock from the event. Marking it with a player number is what separates your target from a real player in that handler.

Watch out

  • It spawns naked and unarmoured. Whatever you are testing has to be put on with Equip Item On Player first, and clothes go on before anything goes in their pockets.
  • No identity means no name: Get Player Name comes back empty and Get Player Steam ID gives "". Do not try to message it, and skip it in any loop that expects real people — For Each Player returns it along with everyone else.
  • It counts as a player everywhere, so anything keyed on player count (Get Online Player Count) or looping over players will include it. Tag it with Set Player Number and gate on that.
  • It falls where you put it: pass a position on the ground, or send it through Snap To Ground first.
  • Once it dies the body behaves like any corpse — it stays put until something removes it. Delete it with Delete Entity if you are respawning a fresh one.

Spawn Infected or Animal

actionserveraction.spawnCreature

Spawns an infected or animal at a position, with its AI running. Use a valid infected (e.g. ZmbM_HunterOld_Autumn) or animal (e.g. Animal_UrsusArctos) class.

Inputs
(exec)exec
Positionvector
Creature Classstringoptional
Outputs
(exec)exec
Creatureentity
Settings
Creature ClassclassnamePickerrequired

Creates an infected or an animal at a position with its AI already switched on, so it wakes up hunting rather than standing idle. It also gets the attachments its config asks for, which is why a spawned infected arrives wearing clothes with loot in them instead of appearing bare.

The position settles onto the terrain surface, so the height you type does not have to be exact — a rough number for the middle value is fine.

When to use it

Ambushes, guarded stashes, event hordes, a boss animal. The other spawners split by what you want: Spawn Item for loot, Spawn Vehicle for something drivable, Spawn Static Object for buildings and props.

To react when one of them dies, pair this with On Creature Killed. To remove one on cue, keep the Creature output and feed it to Delete Entity.

Pins

Position — where it appears, settled onto the ground. Feeding it through Random Point Near scatters a group instead of stacking them all on one spot.

Creature Class — the picker, or a wired text pin that overrides it. Wire it from Random Config Text to roll a different creature out of a config list each time.

Creature — the spawned thing. It fits anywhere an entity or object is wanted: Set Entity Direction to face it, Damage Entity to soften it, Get Entity Position to find it again, Delete Entity to remove it.

Example

A five-strong welcome party around a landmark, rebuilt on every boot: On Server StartedRepeat (Times = 5) → Spawn Infected or Animal (Creature Class ZmbM_HunterOld_Autumn, Position wired from Random Point Near with Center 7500 0 7500 and Radius 15). Each pass of the loop gets its own point, so they arrive spread across a small clearing.

A bear that guards a zone: Player Entered ZoneSpawn Infected or Animal (Animal_UrsusArctos, Position from Offset Position with Position wired from Get Player Position and Offset X = 20) → Send Notification ("Something heard you"). The offset puts the bear a short distance away rather than on top of the player.

Watch out

  • Classnames are case-sensitive and unforgiving: ZmbM_HunterOld_Autumn, not

zmbm_hunterold_autumn. A wrong-case name spawns nothing and the Creature output comes back empty — check it with Is Valid.

node fed by one random point is fine; wire the same random node into two spawners and they land in two different spots. If two nodes must share a point, store it once with Set Global Position and read it back.

  • Creatures are not items. Tag Item does nothing on one, so the

tag trick that identifies your spawned loot does not work here — hold on to the Creature output instead, or recognise them by class with Get Entity Type.

  • Nothing spawned at runtime survives a restart. Re-create the spawn from

On Server Started if it should be there every boot.

  • Every creature is a full AI agent. A Repeat with a big Times value

spawns them all in one frame and the server feels it — keep counts modest, or space them out with Delay.

Spawn Item

actionserveraction.spawnItem

Spawns an item on the ground at a position. Set Placement to "Floating in place" to hang it exactly where you put it — it keeps the height you pass in and never falls, which is how you make a pickup marker hover.

Inputs
(exec)exec
Positionvector
Quantity %floatoptional
Health %floatoptional
Item Classstringoptional
Outputs
(exec)exec
Itemitem
Settings
Item ClassclassnamePickerrequired
Placementselect · On the ground | Floating in place · default "On the ground"

Creates a brand-new item in the world at a position — the same engine call vanilla loot spawning rides. By default the item settles down onto the terrain surface, so the height in Position does not have to be exact. Its starting condition and fill come from the Health % and Quantity % pins.

The Placement prop changes the physics: "Floating in place" keeps the exact height you pass in and switches the item's simulation off, so it hangs in the air and never falls. That is how you make a hovering pickup marker. Either way, items from this node sit outside the loot economy's cleanup timer — they wait until a player takes them or you delete them.

When to use it

Putting loot at a place in the world. Reach for Give Item To Player when it should go straight to a player, Spawn Item In Cargo to create it inside a container, Spawn Static Object for buildings and props, Spawn Vehicle for something drivable, and Spawn Infected or Animal for anything with AI.

Pins

Position — where. On-ground placement settles onto the terrain; floating keeps this exact height.

Quantity % — fill level, for items that have one (a stack of rags, a Canteen's water, a magazine's rounds). Items with no quantity ignore it.

Health % — condition, 100 pristine down to 0 ruined.

Item Class — optional pin that overrides the picker when wired, e.g. from Random Config Text.

Item — the spawned item, ready for Tag Item or Attach Item To Item.

Example

A searchable spot: On Hold Interaction (Object Class the crate you want searchable, Prompt Text "Search", Hold Seconds 5) → Spawn Item (Rag, Position from Get Player Position) → Send Notification ("You found a rag") — hold F on the object and a Rag appears at your feet.

The floating case, a death drop that hangs in the air: On Player DiedDelay (2 seconds, carrying the Victim) → Spawn Item with Position from Get Player PositionOffset Position (Offset Y 1.1), Placement "Floating in place", and Item Class wired from Random Config Text so each death rolls a different grenade out of your config list → Tag Item ("drop") on the Item output. The offset puts the pickup at chest height over the body instead of inside it, the placement stops it falling, and the tag is what later lets a sweep tell your drop from any other M67Grenade lying on the ground.

Watch out

  • Classnames are case-sensitive: GasMask, not Gasmask. A wrong-case class

spawns nothing, silently, every time.

  • A floating item never falls, even after a player notices it — it is for

markers and displays, not regular loot.

  • The spawned item is indistinguishable from one a player dropped. If any

later logic must recognise it, Tag Item it immediately — engine state cannot tell you whose it is. See Tag Item and Get Item Tag.

Spawn Static Object

actionserveraction.spawnStaticObject

Spawns a permanent object (building, prop, decoration) that never despawns. For dropped loot use Spawn Item instead — this one is set to persist forever.

Inputs
(exec)exec
Positionvector
Yaw (degrees)floatoptional
Object Classstringoptional
Outputs
(exec)exec
Objectobject
Settings
Object ClassclassnamePickerrequired

Creates a permanent object at a position — a building, a wreck, a shipping container, a bit of scenery. It is set up with physics and it updates the AI path graph, so infected walk around it instead of through it, and it is created with no lifetime at all, so the loot cleanup never touches it.

The important difference from Spawn Item: this one does not settle onto the terrain. The height in Position is used exactly as given. Get it wrong and the object hangs in the air or sinks into the hillside.

When to use it

Custom outposts, event structures, decoration, blocking a route. The other spawners split by what the thing is: Spawn Item for loot, Spawn Vehicle for something drivable, Spawn Infected or Animal for anything with AI.

Pins

Position — used exactly, with no snap to the ground. Feed it through Snap To Ground to sit it on the terrain, or type a height you measured in game.

Yaw (degrees) — the compass heading, applied straight after creation. 0 is north, 90 east, 180 south, 270 west. Set Entity Direction does the same thing later if you need to turn it again.

Object Class — the picker, or a wired text pin that overrides it. Wire it from Get Config Text At to build a whole scene out of a config list.

Object — the object that was created, for Set Entity Direction or Get Entity Position.

Example

A small outpost rebuilt on every boot: On Server StartedSpawn Static Object (Object Class Land_Container_1Mo, Position from Snap To Ground fed 7500 0 7500, Yaw 90) → Spawn Static Object (Object Class Land_Wreck_Ikarus, Position from Snap To Ground fed 7512 0 7500, Yaw 0). Snap To Ground is doing the real work — with a raw height of 0 both objects would be buried at sea level.

A config-driven version: On Server StartedFor Each Config Position over a list of coordinates → Spawn Static Object with Position wired from the loop's value through Snap To Ground. The server owner edits the list, the graph never changes.

Watch out

  • Position height is taken literally. This is the single most common problem

with this node — always run the position through Snap To Ground unless you measured the height yourself.

  • Classnames are case-sensitive: Land_Wreck_Ikarus, not land_wreck_ikarus. A

wrong-case name spawns nothing and the Object output comes back empty; check with Is Valid.

  • Objects spawned at runtime do not survive a restart. Spawn them from

On Server Started so every boot rebuilds the scene. Spawn them from a repeating timer instead and you get a new copy every tick, stacked inside the last.

  • There is no matching delete. The Object output is an object, not an entity, so

it will not wire into Delete Entity, and As Item comes back empty for a building. Treat these as fixtures for the life of the server session.

  • Physics and the path graph both cost something at creation. Building a large

scene in one Repeat burst will stutter the server — spread it out with Delay if the count is high.

Tag Item

actionserveraction.setItemTag

Marks an item as yours, so you can recognise it later. Tag what you spawn, then read it back with Get Item Tag. This is how you avoid acting on an ordinary item of the same class that a player happened to drop nearby. The tag lives on the item and goes when it does.

Inputs
(exec)exec
Itementity
Tagstring
Outputs
(exec)exec

Writes a short text label onto an item that only your mod can see. Nothing in the game's own state tells you whether a Rag lying in the grass is one you spawned or one a player dropped two minutes ago — the two are the same object in every respect. The tag is how you tell them apart: stamp it the moment you create the item, read it back later with Get Item Tag.

The label lives on the item itself, in a field NodeZ adds to every item in the game. There is no list to maintain and nothing to clean up: when the item is destroyed the tag goes with it. You choose the vocabulary — "airdrop", "arena", "quest" — and nothing else on the server uses it.

When to use it

Any time later logic must act on things your mod made and nothing else: an event drop a sweep should collect while ordinary loot is left alone, a reward crate, a quest item that must be recognised when handed in. Tag on creation, compare on use with Get Item Tag and Text Equals.

If what you need to remember is a number or a name that must outlive the item — a score, a cooldown — that is a variable, not a tag: see Set Global Number and Set Saved Player Number.

Pins

Item — must be an item. Creatures from Spawn Infected or Animal and cars from Spawn Vehicle are not items and tagging one does nothing at all. When the wire is a plain object (a For Each Object Near result), convert it with As Item first.

Tag — any short text. A fixed word is normal; wiring it from Join Text lets you encode which event or which player it belongs to.

Example

Event loot you can clean up afterwards without touching anyone else's gear.

Placing it: Daily At Time (12:00) → Spawn Item (M67Grenade at 7500 0 7500) → Tag Item (Item = the Item output, Tag "airdrop").

Sweeping it up an hour later: Every N Seconds (3600) → For Each Object Near (Position 7500 0 7500, Radius 60) → As Item on the loop's Object → Branch on Text Equals comparing Get Item Tag against "airdrop" → Delete Entity. A grenade a player carried in has no tag and is left where it is; yours are cleared.

Watch out

  • The tag is held in memory only. It is not written into the item's save data,

so it is gone after a server restart and after anything is reloaded from persistence. Tags identify "the thing I just made" within one server session — for anything that must outlive a restart, use a saved variable such as Set Saved Number.

  • Tag the item immediately, in the same chain that created it. After a

Delay only the player carries across, so the Item output from before the wait no longer exists. If you truly must carry an item across a wait, Remember Item does it — but it is a weak handle and reads back empty once the item is destroyed.

  • Only items. A tag written to a creature, a vehicle or a building silently

does nothing, and Get Item Tag on one always comes back empty.

  • An untagged item reads back as empty text, so compare against your exact tag

rather than testing "not empty" if more than one tag is in play.

  • Tags are per-mod, not per-item-class. Two different graphs in the same project

writing "drop" will see each other's items — pick distinct words.

Teleport Player

actionserveraction.teleportPlayer

Moves a player to a position on the map. Handles players in vehicles safely and never drops them underwater.

Inputs
(exec)exec
Playerplayer
Positionvector
Outputs
(exec)exec

Moves a player somewhere else on the map instantly. It rides vanilla's own teleport helper — the same code the developer tools use — so the awkward cases are handled for you: a player sitting in a car is moved with the vehicle rather than left behind, and the destination is adjusted so nobody arrives underwater.

Everything about it runs on the server, so a mod built around teleporting works without players installing anything. What is not free is the moment afterwards. The engine has to rebuild the player at the new location for every other client, and anything you create on them during that rebuild can fail to reach those clients — which is why nearly every teleport in a real graph is followed by a short wait.

When to use it

Arena entry, safe-zone ejection, event transport, a "return to base" reward. To send someone to another player, wire Get Player Position into Position. To move everyone in an area, drive it from For Each Player Near. To scatter arrivals rather than stack them on one tile, feed Position through Random Point Near.

Pins

Player — who moves.

Position — map coordinates. The height (the middle number) can be approximate; the helper will not leave the player in water. Wire it from Get Config Position and a server owner can move the destination without opening the editor, or from Random Config Position to pick from a list of spawn points.

Example

An arena entry that arrives dressed: On Hold Interaction (Object Class Land_Wreck_Ikarus, Prompt Text "Enter arena", Hold Seconds 3) → Teleport Player (Position from Random Point Near with Center 7500 0 7500 and Radius 20) → Delay (2 seconds, carrying the Player) → Clear InventoryEquip Item On Player (PlateCarrierVest) → Give Weapon (M4A1, Mag_STANAG_30Rnd) → Resync Player Gear.

The delay is the whole point of that wiring, not padding. Hand out the gear in the same instant as the teleport and the fighter holds a rifle on their own screen while everyone else sees an unarmed survivor in a t-shirt.

Watch out

  • Never create, give, equip or attach anything in the same instant as a

teleport. Wait about 2 s with Delay first, and finish the chain with Resync Player Gear as a backstop.

  • After a Delay the only value carried across is the player. Anything

else the follow-up needs — which arena, which loadout was rolled — must be stamped onto the player with Set Player Number or Set Player Text before the wait and read back after. A global is not safe here: another player teleporting during your two seconds overwrites it, and the second player gets the first one's kit.

For Each Player Near. Teleporting everyone in a zone drags dead bodies along too — gate on Is Player Alive when that matters.

  • The Player wire must be real. Straight off an event pin it always is; from

Get Player By Name or Get Player By Steam ID it can be empty, so check with Is Valid first.

  • Position is exact coordinates, not a place name, and DayZ's middle number is

height, not the second map axis. Copy the numbers from the game's own debug position readout rather than typing them from memory.

Values

Values/Config

Config List Count

pureserverpure.configListCount

How many items are in a config list.

Outputs
Countint
Settings
Config FieldconfigFieldPickerrequired

How many entries a config list holds on this particular server. It works with all three list types — a list of text, of numbers, or of positions — so the field picker on this node offers every list in your project.

It matters because the length is the owner's, not yours. You ship a default list of three spawn points; someone adds twelve. Every graph that walks or samples that list has to ask how long it actually is, and this is the node that asks.

When to use it

Whenever you need the number itself: as the Times of a Repeat, as the Max of Random Number to roll an index, or with Remainder (Modulo) to wrap a rising counter back to the start of a list. When you only want to visit every entry in order, you do not need it at all — For Each Config Text, For Each Config Number and For Each Config Position already walk to the end on their own.

Example

One roll shared across matched lists. Say the Config panel has kitWeapon and kitMag, two lists of text with the same entries in the same order. Wire On Player ReadyRandom Number (Min 0, Max from Config List Count on kitWeapon) → Set Player Number ("kit") to store the roll, then read that number back with Get Player NumberTo Whole Number and feed the whole number into the Index of both Get Config Text At nodes. Max is exclusive, so the count goes in as-is with no minus one.

Watch out

  • An empty list counts 0. A Repeat of 0 simply does not run, which is harmless; a Random Number with Max 0 gives 0, and index 0 of an empty list gives empty text — so an owner who deleted every entry gets silence, not an error.
  • Counting one list and indexing another only works while they stay the same length. If an owner adds a weapon and forgets the magazine, the tail entries read back empty and nothing is given, silently. Count the shortest list, or say plainly in the field descriptions that the lists must line up.
  • The count is a whole number, so it drops straight into Times and Max pins with no conversion. That is not true of Get Config Number, which is a decimal.

Get Config Number

pureserverpure.getConfigNumber

Reads a number from the mod config (server owners set it in config.json).

Outputs
Valuefloat
Settings
Config FieldconfigFieldPickerrequired

Reads one number out of your mod's config file. You define the field in the Config panel — a name, a type, a default and a description — and the build generates a config.json in the server's profile folder, in a folder named after your mod. This node hands back whatever the server owner has in there.

That swap is the whole point of config. A number typed into a pin can only be changed by opening NodeZ and rebuilding; a number read from config can be changed by anyone running the mod, with a text editor. Reward sizes, radii, cooldowns and timer intervals all belong here. The build also writes a config-reference.txt alongside the mod listing every field, its type and its default, so an owner knows what each key means without asking you.

When to use it

Any number a server owner might reasonably want different from yours. The siblings cover the other types: Get Config Text, Get Config On/Off, Get Config Position. For a whole list of numbers, For Each Config Number walks it, Get Config Number At reads one entry and Config List Count measures it. Config is read-only input from the owner — for numbers your mod works out while it runs, use Set Global Number, or Set Saved Number when they must survive a restart.

Example

A tunable payout. Add a Number field killReward with default 500, then wire On Player DiedBranch (Condition from Is Valid on Killer) → True → Add To Saved Player Number on the Killer with Amount from Get Config NumberSend Notification. Whoever runs the mod raises the payout by editing one line and restarting.

The same value can tune an event's own setup: wire it into the Every (seconds) pin of Every N Seconds. Those pins are built when the mission starts, so they accept typed-in values and config reads — and nothing else.

Watch out

  • The file is read once, when the server starts. Editing config.json while the server is up changes nothing until the next restart.
  • A config number is a decimal. Pins that insist on a whole number — Repeat's Times, an Index, a quick-bar slot — will not accept it; put To Whole Number in between.
  • The config file lives on the server. In a chain that runs on the player's machine (a HUD or menu chain that never crosses to the server) the read falls back to the default you typed in the editor rather than the owner's file. Read config in server chains and send the result out with Send Client Message.
  • Renaming a field in the Config panel renames the JSON key. Existing config.json files keep the old key, and the new one quietly reads your default.
  • Deleting the field while a node still points at it fails the build with a clear message, so a broken reference never ships silently.

Get Config Number At

pureserverpure.configNumberAt

Reads one entry of a config list by its position (0 is the first). An empty list or out-of-range index safely gives an empty/zero value. Use one shared random index across several parallel lists to pick MATCHED entries (a weapon and its magazine).

Inputs
Index (from 0)int
Outputs
Numberfloat
Settings
Config FieldconfigFieldPickerrequired

Entry number N of a config list of numbers, counting from 0. Use it when the numbers in a list belong to something else in another list — the payout for tier N, the radius of zone N, the delay for wave N.

A list of numbers alone is rarely interesting. Paired with a list of text or positions of the same length, read with the same index, it becomes a table an owner can extend by adding one line to each list.

When to use it

Reading one specific entry, usually as one column of a set of parallel lists. To visit every number in order use For Each Config Number; for a single tunable number that is not part of a list, Get Config Number is simpler. The matching readers for the other list types are Get Config Text At and Get Config Position At.

Pins

Index (from 0) — 0 is the first entry. An out-of-range or negative index, or an empty list, gives 0 rather than an error.

Number — a decimal, like every config number. Whole-number pins need To Whole Number in between.

Example

Reward tiers, driven by two parallel lists: tierItem (a list of text: BandageDressing, Mag_STANAG_30Rnd, M67Grenade) and tierChance (a list of numbers: 60, 30, 10). Wire On Player DiedRepeat with Times from Config List Count on tierItem, and in the Body run Get Config Number At (tierChance, Index from the loop's Index) into the Percent pin of Random ChanceBranch → True → Give Item To Player with Item Class from Get Config Text At (tierItem, same Index). Each pass rolls that tier's own chance, and the loop's Index is already a whole number, so it wires into both lookups directly.

Watch out

  • Out of range gives 0, and 0 is a plausible-looking number. A zero radius, a zero payout or a zero chance just does nothing — check the list lengths agree rather than trusting the value.
  • The Index pin only takes whole numbers; the value it returns is a decimal. Those are two different pins and only the first needs To Whole Number.
  • Lists have to be edited in step. Say so in the field descriptions — they end up in the config-reference.txt the owner reads.

Get Config On/Off

pureserverpure.getConfigToggle

Reads an on/off switch from the mod config.

Outputs
Onbool
Settings
Config FieldconfigFieldPickerrequired

Reads an on/off field from your mod's config file — true or false in the config.json a server owner edits. It gives you a plain true/false value, which almost always goes straight into a Branch.

This is how one build serves servers that want different things. Instead of shipping two versions of a mod, you expose a switch per feature and let the owner decide which parts run.

When to use it

Feature switches: kill rewards on or off, the airdrop timer on or off, debug logging on or off. Put the check as early in the chain as you can — right after the event — so a disabled feature costs nothing further down. For a value with more than two states, an owner-typed word plus Switch On Text and Get Config Text gives you named modes instead.

Example

Add an On/Off field killRewardEnabled with default true. Then On Player DiedBranch with its Condition wired from Get Config On/Off → the True path holds the whole reward chain, and the False path stays empty. An owner who dislikes rewards flips one word to false, restarts, and everything else in the mod carries on.

Watch out

  • Read once at server start. Flipping the switch while the server runs does nothing until the next restart.
  • Deleting the key from config.json does not mean "off" — a missing key keeps the default you set in the Config panel. Pick that default as the behaviour you want a hands-off owner to get.
  • Like every config read, this only sees the owner's file in server-side chains; in a chain running on the player's machine it falls back to the compiled default.

Get Config Position

pureserverpure.getConfigPosition

Reads a world position [x, y, z] from the mod config.

Outputs
Positionvector
Settings
Config FieldconfigFieldPickerrequired

Reads a map position out of your mod's config file. In the config.json a Position field is written as three numbers in brackets — [7500, 0, 7500] — which is x, height, z, the same order the game's own coordinates use.

Positions are the config type owners change most, because every server runs a different map. A trader spot, an arena centre, a safe zone: hard-code one and your mod only fits Chernarus; read it from config and it fits anything.

When to use it

Any single fixed place. For a set of places — every spawn point, every airdrop target — define a Position list instead and use For Each Config Position to visit them all, Random Config Position to pick one, or Get Config Position At to read a specific entry. For a position your mod computes while running, Set Global Position and Get Global Position are the pair you want.

Pins

Position — the value as typed. It is not snapped to anything: if the height an owner wrote is wrong, this hands you the wrong height. Run it through Snap To Ground before spawning something at it.

Example

A tunable zone. Add a Position field zoneCenter (default [7500, 0, 7500]) and a Number field zoneRadius (default 30), then wire them into Player Entered Zone's Center Position and Radius pins. Those two pins are set up when the mission starts, which is exactly why config reads are allowed there — the zone is built at boot from the owner's numbers. The Toxic zone template (File → New from template) is this same wiring with the values typed in; swapping them for config reads is what makes it shippable to other people.

Watch out

  • A height of 0 means sea level, not ground level. Zone pins treat 0 as "snap to the ground", but a spawn does not: send the position through Snap To Ground or your item ends up under the terrain.
  • Owners must keep all three numbers in the brackets. Positions are the easiest field to break by hand, so name the field clearly and describe the order in its description — that text is printed into config-reference.txt.
  • Read once at server start; an edit needs a restart. And like every config read, on a player's machine it falls back to the compiled default rather than the owner's file.

Get Config Position At

pureserverpure.configPositionAt

Reads one entry of a config list by its position (0 is the first). An empty list or out-of-range index safely gives an empty/zero value. Use one shared random index across several parallel lists to pick MATCHED entries (a weapon and its magazine).

Inputs
Index (from 0)int
Outputs
Positionvector
Settings
Config FieldconfigFieldPickerrequired

Entry number N of a config list of positions, counting from 0. It is the lookup you reach for when a place has other properties stored beside it — a name, a radius, a reward — each in its own list, all read with the same index.

An owner then edits one row across several lists: add the coordinates to zonePoint, the name to zoneName, the size to zoneRadius, and a new zone exists without anyone opening NodeZ.

When to use it

Reading one specific place out of a list, usually as part of a matched set. To visit every position in turn use For Each Config Position; to pick one at random use Random Config Position. For a single fixed place that is not part of a list, Get Config Position is the one you want.

Pins

Index (from 0) — 0 is the first entry. An out-of-range or negative index, or an empty list, gives 0 0 0.

Position — exactly as the owner typed it, with no snapping. Send it through Snap To Ground before spawning or teleporting.

Example

Named supply caches. Two lists in the Config panel: cachePoint (positions) and cacheName (text), one entry each per location. Wire On Server StartedRepeat with Times from Config List Count on cachePoint. In the Body, run Get Config Position At (cachePoint, Index from the loop) → Snap To Ground → into the Position of Spawn Item (SeaChest), and alongside it Log Message carrying the matching Get Config Text At (cacheName, same Index). Booting the server then prints one line per cache, which is how you find out whether the owner's coordinates landed where they meant.

This is also why the node exists next to For Each Config Position: the loop node walks one list beautifully, but it gives you no index, so it cannot pull the matching name out of a second list.

Watch out

  • 0 0 0 is not a harmless fallback — it is the corner of the map, out at sea. An index past the end of the list will happily teleport a player there or spawn a crate in the water. Drive the index from Config List Count on the same list.
  • A height of 0 means sea level. Use Snap To Ground unless the owner is expected to type exact heights.
  • The Index pin takes whole numbers only; a stored roll read back with Get Player Number or Get Global Number is a decimal and needs To Whole Number first.
  • Parallel lists must be edited in step, or the tail entries of the longer list pair with nothing.

Get Config Text

pureserverpure.getConfigText

Reads a text value from the mod config (e.g. a classname or message).

Outputs
Valuestring
Settings
Config FieldconfigFieldPickerrequired

Reads one line of text out of your mod's config file — a field you defined in the Config panel, stored in the config.json that lives in the server's profile folder. Text is the most valuable config type in DayZ, because so much of the game is spelled out in classnames: what a reward is, what a starting kit contains, what a sign says.

Anywhere a node offers a classname picker it also has a matching text pin, and a wire into that pin beats the picker. That is how one graph serves every server: your node says "give the reward item", and the owner's config says which item that is.

When to use it

Classnames, messages and names a server owner should control. For several values in one entry — a whole loadout on one line — encode them as "name=value; name=value" and unpack with Get Setting, or as a comma list unpacked with Get Text Part. For a list of text fields use For Each Config Text, Get Config Text At or Random Config Text. The other single-value readers are Get Config Number, Get Config On/Off and Get Config Position.

Example

A reward whose item and wording are both tunable. Add two Text fields: rewardItem (default "Mag_STANAG_30Rnd") and rewardText (default "Payment received"). Then On Player DiedBranch (Condition from Is Valid on Killer) → True → Give Item To Player on the Killer with Item Class wired from Get Config Text (rewardItem) → Send Notification with Detail wired from a second Get Config Text (rewardText). Two separate nodes, one per field — each reads its own field, so there is no fan-out to worry about.

Watch out

  • Classnames are case-sensitive, and now a stranger is typing them. "Gasmask" instead of GasMask produces nothing, with no error anywhere. Say the exact spelling in the field's description — it is printed into config-reference.txt for the owner.
  • Empty text is a legitimate answer. Give Item To Player with a blank Item Class gives nothing at all, which makes an optional slot in a kit safe to leave empty, but also hides an owner's typo'd key as "nothing happened".
  • One list entry is one string; config lists cannot nest. Pack the parts into a single entry with separators and unpack them with Get Setting or Get Text Part.
  • Read once at server start — an edit needs a restart. And the read only sees the owner's file in server-side chains; on a player's machine it falls back to the default compiled into the mod.

Get Config Text At

pureserverpure.configTextAt

Reads one entry of a config list by its position (0 is the first). An empty list or out-of-range index safely gives an empty/zero value. Use one shared random index across several parallel lists to pick MATCHED entries (a weapon and its magazine).

Inputs
Index (from 0)int
Outputs
Textstring
Settings
Config FieldconfigFieldPickerrequired

Entry number N of a config list of text, counting from 0. On its own that is a plain lookup. Its real job is keeping several lists in step: one index into kitWeapon, the same index into kitMag, the same index into kitTop, and entry 3 of each belongs to the same kit.

That is the way around the rule that config lists cannot nest. You cannot write a list of loadouts, but you can write three lists of the same length and read them with a shared index, and an owner adding a fourth kit adds one line to each.

When to use it

Parallel lists, and any time you want a specific entry rather than a random one. Random Config Text is the shortcut for "any entry, at random" — but it rolls separately at every use, so it cannot hold two lists together. Roll an index once instead and bring it here. To visit every entry in order, use For Each Config Text.

Pins

Index (from 0) — 0 is the first entry. Out of range, negative, or an empty list all give empty text rather than an error, so a short list from an owner can never break a handler.

Example

Three text lists in the Config panel — kitWeapon, kitMag, kitTop — with entry 0 reading AKM / Mag_AKM_30Rnd / TShirt_Black and entry 1 reading M4A1 / Mag_STANAG_30Rnd / TShirt_Red.

Wire On Player ReadyRandom Number (Min 0, Max from Config List Count on kitWeapon) → Set Player Number ("kit") → Clear InventoryGive Weapon with Weapon Class from Get Config Text At (kitWeapon) and Magazine from another Get Config Text At (kitMag) → Give Item To Player with Item Class from a third (kitTop). Every one of those Index pins comes from the same stored roll: Get Player Number ("kit") → To Whole Number. One roll, three matched reads, and a whole extra kit is three lines of config.

Watch out

  • Roll the index once and store it. Random Number gives a different number at every wired use — feed it into three Index pins directly and you get three unrelated kit pieces. The editor warns about this as a volatile fan-out.
  • Index is a whole number. A decimal source — a config number, a division, a stored player number — needs To Whole Number before it will wire in.
  • Lists of different lengths fail quietly. Past the end of the shorter list you get empty text, and an empty classname gives no item and no error.
  • Classnames are case-sensitive, and an owner is typing these. "Mag_Stanag_30Rnd" will never match Mag_STANAG_30Rnd.

Random Config Position

pureserverre-rolls per usepure.randomConfigPosition

Picks a random position from a config list (a zero vector if the list is empty).

Outputs
Positionvector
Settings
Config FieldconfigFieldPickerrequired

Picks one position at random from a config list of positions. An owner lists the places an event may happen — twelve airdrop targets, six ambush spots — and this node chooses one of them, evenly.

Like every random node it produces a fresh value at every use rather than holding one. That matters more here than anywhere else, because a chosen place is usually needed several times over: to spawn at, to announce, to explode at.

When to use it

Choosing one of the owner's places for an event. To do something at every place instead, use For Each Config Position. When the place must line up with an entry in another list — its name, its radius — roll an index once with Random Number and read the lists with Get Config Position At and Get Config Text At instead. For a random point anywhere near somewhere, rather than a point off a list, see Random Point Near.

Example

A recurring supply drop. Add a Position list dropPoints with a few coordinates, and a Number field dropEvery (default 1800). Wire Every N Seconds (Every (seconds) from Get Config Number) → Set Global Position ("drop"), with its Position pin fed by Random Config Position → then Spawn Item (SeaChest), whose Position comes from Get Global Position ("drop") through Snap To Ground → then Broadcast Notification ("Supplies inbound").

Storing the pick in a global on the first line is the whole trick. Everything after it reads the same stored point, so the crate, the announcement and anything else you add later all agree on where the drop is.

Watch out

  • Wire this node to two pins and you get two different places, with the editor warning about a volatile fan-out. Store the pick with Set Global Position and read it back — that is safe here because a timer is the only thing writing it, unlike a per-player event where another player can overwrite a global while you work.
  • An empty list gives 0 0 0 — the sea corner of the map, not "nowhere". A drop event with an empty pool quietly ships crates to the ocean; guard with Config List Count if the pool may be empty.
  • Positions come back exactly as typed, so run them through Snap To Ground before spawning unless owners are expected to give exact heights.
  • The pool is read once at server start. Adding coordinates needs a restart before they can be picked.

Random Config Text

pureserverre-rolls per usepure.randomConfigText

Picks a random text value from a config list (empty text if the list is empty).

Outputs
Textstring
Settings
Config FieldconfigFieldPickerrequired

Picks one entry at random from a config list of text. The owner writes the pool — five reward items, ten greetings, three vehicle classnames — and this node reaches in and takes one, with every entry equally likely.

The important word is *random*. This node does not hold a value; it produces a new one every time something asks. Wire it into one place and that place gets one pick. Wire it into two places and those two places get two unrelated picks.

When to use it

Variety with no bookkeeping: a random reward, a random spawn item, a random line of flavour text. When the choice has to match something in another list — a weapon and its magazine — do not use this node; roll a number once with Random Number and read every list with Get Config Text At at that index. To act on every entry rather than one, use For Each Config Text.

Example

A random payout. Add a Text list rewardPool with entries Mag_STANAG_30Rnd, BandageDressing and M67Grenade. Then On Player DiedBranch (Condition from Is Valid on Killer) → True → Give Item To Player on the Killer with Item Class wired from Random Config Text.

To name the item in the message afterwards, do not wire this node a second time — that would roll again and announce something the player never got. Feed the Item output of Give Item To Player into Get Display Name and put that in the notification. One roll, and the message always tells the truth.

Watch out

  • Wiring the output to more than one place gives a different pick at each, and the editor flags it as a volatile fan-out. When two nodes genuinely need the same pick, stamp it somewhere first: Set Player Text on the player, read back with Get Player Text.
  • One wire into one pin is one pick, however many times the receiving node uses the value internally. Give Item To Player trying the inventory and then the ground does not roll twice.
  • An empty list gives empty text, and an empty classname gives no item at all — silently. If the pool matters, check the count with Config List Count first.
  • Classnames are case-sensitive and an owner is typing them. A wrong-case entry sits in the pool forever, handing out nothing whenever it is picked.

Values/Entity

As Item

pureserverpure.asItem

Treats an object as an item so item and entity nodes accept it. Loops like For Each Object Near hand you plain objects — buildings and trees included. Empty when the object is not an item, so check it with Is Valid before using it.

Inputs
Objectobject
Outputs
Itemitem

Some pins hand you a plain "object" — the widest handle the engine has, covering everything that can sit in the world: trees, houses, rocks, vehicles, creatures and items all at once. Most item nodes need something narrower than that. As Item is the conversion: it asks whether the object really is an item and, when it is, gives you an item handle the item and entity nodes will accept. When it is not — a pine tree, a wall — the output comes back empty.

Nothing is created and nothing is changed; this only re-labels a wire. And it is only ever needed in that one direction: an item flows into an object pin on its own, but an object never flows into an item pin without this node.

When to use it

Straight after anything that gives you an Object. For Each Object Near is the big one — it returns literally everything inside the radius, scenery included. Cast To Player is the same idea for players. If all you want is the class name of a thing, Get Entity Type takes an object directly and needs no conversion at all.

Pins

Item — empty whenever the object was not an item. Test it with Is Valid before anything downstream touches it.

Example

Sweeping an arena clean between rounds: Every N Seconds (300) → For Each Object Near (Position "7500 0 7500", Radius 200) → As Item on the Object → Is ValidBranch. The True path then checks the item is one of yours — Get Item TagText Equals ("drop") → a second BranchDelete Entity. Without the conversion the tag read has nothing to work with; without the Is Valid, every tree inside the radius runs the rest of the chain.

Watch out

  • Empty is the ordinary answer, not a failure. Most of what For Each Object Near returns is map scenery, so the Is Valid gate is not optional.
  • Players, creatures and vehicles are not items, and neither is a corpse. All of them convert to empty.
  • The conversion is a label, not a guarantee about ownership. An item of yours and an identical one a player dropped both convert happily — use Tag Item and Get Item Tag to tell them apart.

Get Entity Direction

pureserverpure.getEntityDirection

Which compass direction an object, creature or vehicle faces, in degrees (0 = north, 90 = east). The counterpart to Set Entity Direction.

Inputs
Entityobject
Outputs
Facing (degrees)float

Which way a thing is turned, as a compass bearing in degrees: 0 is north, 90 east, 180 south, 270 west. It reads the yaw — the first of the three numbers in an object's orientation — and it is exactly the number Set Entity Direction writes back, so the two make a matched pair for copying a facing.

Anything placeable is fair game: an item on the ground, a spawned prop, a creature, a vehicle, a player.

When to use it

Recording, comparing or copying a facing. Line a new prop up with the one already standing there, note which way a car was pointing, or check whether two things face roughly the same way. Get Player Direction answers the same question from a Player pin. Do not reach for it when you actually want Direction A To B — that is the bearing from one position towards another, a question about where things are rather than which way one is turned.

Example

A parking log for the server's cars: On Vehicle Engine StartedGet Entity Direction (Vehicle) → Round NumberJoin Text ("engine on, facing ") → Log Message. The bearing lands in the server log next to the timestamp.

Copying a facing between two graphs: On Hold Interaction (Object Class Barrel_Green, Prompt "Note angle") → Get Entity Direction on the Target → Set Global Number ("angle"). Somewhere else, Spawn Static Object feeds Get Global Number ("angle") into Set Entity Direction, so the replacement stands the way the original did.

Watch out

  • Bearings wrap around. 359 and 1 are two degrees apart, not 358 — subtract, take Absolute Value, and treat any result above 180 as 360 minus that.
  • Only the yaw comes back. Pitch and roll are not in this number, so a car lying on its roof still reports an ordinary bearing. Detecting that is not this node's job; Unflip Vehicle is.
  • The wire is read straight through with no guard. An empty object has no orientation and the rest of that chain stops, so check doubtful sources — a search result, a remembered item — with Is Valid first.

Get Entity Health

pureserverpure.getEntityHealth

An entity's overall health as a 0-1 percentage (0 = destroyed, 1 = full).

Inputs
Entityentity
Outputs
Health %float

One number for how intact something is: 0 is destroyed, 1 is untouched. It is the overall figure for the whole thing rather than any one damage zone, so 0.5 means "half wrecked" whether it is a car, an infected, a tent or a rifle. The generated helper checks the wire first — an empty entity answers 0 instead of erroring.

Note the scale. Health percentages you type into nodes like Spawn Item run 0-100; this one runs 0-1. Multiply by 100 with Multiply before putting it in front of a player.

When to use it

Any "how damaged is it" test on something that is not specifically an item — creatures, vehicles, spawned props. Get Item Health is the item-flavoured version and gives you both the raw value and the 0-1 figure, plus an optional damage zone. Get Player Health covers players.

Example

Repairing the arena's cars overnight: Daily At Time (Hour 4) → For Each Object Near ("7500 0 7500", Radius 300) → Get Entity Health on the Object → Less Than (0.9) → BranchRepair Entity on the True path. Anything battered is topped back up once per in-game day and anything already healthy is left alone.

Watch out

  • 0 means two things: genuinely destroyed, and "nothing was wired in". Where that difference matters, gate on Is Valid first.
  • It reads the thing as a whole. A car with one ruined wheel and everything else pristine still reports a high number — per-zone checks need Get Item Health with a zone name.

Get Entity Position

pureserverpure.getEntityPosition

Where an object, item, or creature is on the map.

Inputs
Entityentity
Outputs
Positionvector

Where a thing is standing on the map, as a position — three numbers: east/west, height, north/south. It is the same value Get Player Position gives for a player, but the pin here takes anything at all: an item, a creature, a vehicle, a spawned prop. A Player wire drops straight in too, so this is the one position getter that covers everything.

When to use it

Anything spatial that starts from a thing rather than a person: how far a dropped crate is from a marker, where to put an effect after a creature dies, what to sweep around. It feeds Distance Between, Spawn Item, Play Sound At Position and Teleport Player without conversion.

Example

An alarm on a stash you placed. First put it down and keep hold of it: On Server StartedSpawn Item (SeaChest, Position "7500 0 7500") → Remember Item ("crate"). Then watch it: Every N Seconds (30) → Get Remembered Item ("crate") → Is ValidBranch; on True, Get Entity PositionCount Players Near (Radius 15) → Greater Than (0) → a second BranchBroadcast Notification ("Someone is at the stash").

The position is read fresh every tick rather than stored once at spawn, because a player can pick the crate up and walk off with it — and the alarm should follow.

Watch out

  • The wire is read with no guard. An empty entity has no position and the rest of that chain stops, so anything that can legitimately come back empty — a search result, a remembered item, an As Item conversion — needs Is Valid in front of it.
  • An item someone is carrying is not lying on the ground, and its position is not a useful map spot. When you want to know who has it, use Get Item Owner instead.
  • Read it where you need it. A position worked out before a Delay cannot cross the wait — only the carried player does — so re-derive it on the far side.

Get Entity Type

pureserverpure.getEntityType

An object's class name as text, e.g. "M4A1" for a rifle (empty if nothing). Handy for a killfeed — feed the killer's held item to show which weapon they used.

Inputs
Entityentity
Outputs
Type Namestring

The class name of a thing, as text: "M4A1" for that rifle, "Mag_STANAG_30Rnd" for its magazine, "ZmbM_HunterOld_Autumn" for an infected. This is the internal name servers deal in everywhere — types.xml, spawner configs, the editor's classname picker. It is not the label a player reads in their inventory; Get Display Name gives that one.

The generated helper is null-safe: an empty wire returns empty text rather than erroring.

When to use it

Whenever you need to know *what* something is: naming the murder weapon in a killfeed, filtering a loop down to certain classes, writing something useful into a log. For a plain yes/no against one class, Is Item Of Type does it in a single node instead of this plus Text Equals. To send many different classes down different paths, feed the text into Switch On Text.

Example

A killfeed line that names the weapon: On Player DiedIs Valid (Killer) → Branch; on True, Get Item In Hands (Killer) → Get Entity TypeJoin Text with Get Player Name on the Killer and again on the Victim → Broadcast Chat Message. The result reads "Bandit killed Survivor with M4A1", and an empty-handed killer simply produces an empty weapon name in the middle of the sentence.

Watch out

  • The text comes back exactly as the game holds it, and text comparisons are case-sensitive. Match with Text Equals against the precise class — "Aug", never "AUG".
  • Empty text is both "nothing was wired in" and a genuine blank, so guard sources that can be empty with Is Valid rather than testing for "".
  • It is the exact class, not a family. "Mag_STANAG_60Rnd" is not "Mag_STANAG_30Rnd", and a compare against the wrong one of the pair fails forever. Use Text Contains when you want to catch a whole family.

Get Item Tag

pureserverpure.getItemTag

Reads the tag your mod put on an item (empty if it has none). The reliable way to recognise an item YOU spawned. Two items of the same class — one you placed, one a player dropped — look identical otherwise, and no engine state separates them dependably.

Inputs
Itementity
Outputs
Tagstring

Reads back the mark Tag Item put on an item. Empty text when the item carries no tag.

It exists because the engine cannot answer a question you will ask constantly: is this item mine? Two Rags lying side by side — one your reward drop, one dropped by a player — are the same class, the same condition, the same everything. No engine state separates them dependably. Tagging solves it by hand: mark what you create at the moment you create it, read the mark back later, and the two become distinguishable forever.

When to use it

Any sweep, cleanup or reward check that must only touch items your mod placed. It only works if you tagged them — an untagged item can never be recognised afterwards, so the tag goes on immediately after the spawn. Is Frozen In Place is the weaker cousin: it needs no tagging, but it only recognises items spawned with the "Floating in place" placement and it carries no name of your choosing.

Pins

Item — takes any entity. Creatures, vehicles and players always answer empty, because the tag lives on the item side of the engine.

Example

An arena sweep that clears only your own drops: On Server StartedSpawn Item (M67Grenade at "7500 0 7500") → Tag Item ("drop") on the Item output. Then, later: Every N Seconds (300) → For Each Object Near ("7500 0 7500", Radius 200) → As ItemGet Item TagText Equals ("drop") → BranchDelete Entity on the True path. Grenades players brought in themselves survive the sweep; yours do not.

Watch out

  • The tag lives on the item in memory and dies with it. It is not written into the world save, so a tagged item that survives a server restart comes back untagged — re-tag at startup rather than trusting a tag from a previous uptime.
  • Only items carry tags. Hand it a creature or a vehicle and you get empty text, with nothing to tell you why.
  • Empty is the answer for "no tag" *and* for "not an item". Compare against the exact tag with Text Equals instead of testing for "not empty".
  • The comparison is case-sensitive like any text compare: "Drop" and "drop" are two different tags.

Is Frozen In Place

pureserverpure.isFrozenInPlace

True for an item that was spawned with physics switched off. Pairs with Spawn Item's "Floating in place" placement. Use it to tell YOUR placed items apart from ordinary ones of the same class lying around — a hovering pickup answers true, the identical item a player just threw answers false.

Inputs
Entityentity
Outputs
Is Frozenbool

True when an item's physics have been switched off — it hangs exactly where it was put and never falls. Spawn Item does that when its Placement is set to "Floating in place", so in practice this node is asking "did I place this, as a hovering marker?"

It is a physics flag, not a record of ownership, which makes it the quick answer rather than the certain one. An empty wire answers false rather than erroring.

When to use it

Recognising your own floating pickups without tagging them — one node instead of two. When the answer has to be trustworthy, or when some of your items sit on the ground normally, use Tag Item at spawn and Get Item Tag to read it back: a tag carries a name you chose and cannot be confused with anything else.

Example

A hovering pickup and the sweep that clears it: On Server StartedSpawn Item (M67Grenade, Position "7500 0 7500", Placement "Floating in place"). Then Every N Seconds (120) → For Each Object Near ("7500 0 7500", Radius 150) → As ItemIs Frozen In PlaceBranchDelete Entity on the True path. The markers still hanging in the air at the end of a round are removed; grenades players actually carried in and dropped stay where they are.

Watch out

  • It cannot tell your markers from anyone else's. Anything that disables an item's simulation reads as true, including a floating item placed by a different mod on the same server. Where that matters, tag instead.
  • A floating item never falls and sits outside the loot economy's cleanup timer, so nothing removes it but you. Sweep your markers or they pile up across a long uptime.
  • False is also what an empty wire gives, so a failed As Item conversion looks exactly like "an ordinary item". Put Is Valid in front when the difference matters.

Values/HUD

Find Child Widget

pureclientpure.hudFindWidget

Finds a named widget inside another widget (empty if not found).

Inputs
Parentwidget
Namestring
Outputs
Widgetwidget

Turns a name into a widget handle. Every widget in the layout editor can be given a name; hand this node a widget you already have plus a name, and it gives back the matching one inside it — the label you want to write to, the container you want to add rows into.

The search covers the whole tree beneath Parent, not just its direct children, so a label three panels deep is reachable straight from the overlay Root.

When to use it

Between anything that creates widgets (Show HUD Overlay, Add Widget From Layout) and anything that changes them (Set Text, Set Widget Visible, Set Widget Size). For a widget in an open *menu* rather than an overlay, Set Widget Text picks the widget from a dropdown of that layout and needs no handle at all.

Pins

Parent — where to search, and the whole game is here. From an overlay Root you get the first match anywhere in the overlay; from one card's handle you get that card's own copy. In a list of identical cards, searching from the Root always lands on card one.

Name — typed exactly as it appears in the layout editor, capitals included. Unlike the menu nodes' dropdown, this is free text and is not checked against the layout, so a typo only shows up in game as a HUD that never updates.

Widget — empty when nothing matches. Nodes downstream null-check, so the result of a bad name is silence, not an error.

Example

A one-line status readout. Layout hudinfo holds a text widget named InfoLine. On the client: On Client Message "info" → Show HUD Overlay (hudinfo) → Scale For ScreenSet Text, with Widget wired from Find Child Widget (Parent = Root, Name "InfoLine") and Text from the message's Text 1.

Watch out

  • Names are case-sensitive, the same way classnames are: "InfoLine" is not "Infoline", and the wrong one fails silently and forever.
  • Duplicate names across repeated cards are normal — as long as you search from the card handle that Add Widget From Layout gave you, not from the overlay Root.
  • An empty Parent gives an empty Widget, with no message. When a HUD stops updating, check this node's Parent before you suspect the name.
  • Client-side only, like every HUD node: the project must be Server + Client.

Text Width

pureclientpure.hudTextWidth

How many pixels wide the text in a widget actually draws. Add these up to size a panel around a row of labels. 0 if the widget holds no text.

Inputs
Text Widgetwidget
Outputs
Width (px)float

How many pixels wide the text in a widget actually draws — measured from the live widget, in the font and size it is currently using, not estimated from the number of letters. It refreshes the widget's layout before measuring, so the number describes the string that is in there now.

When to use it

Whenever a size or a position has to follow text of unknown length: adding widths up to size a background panel with Set Widget Size, or placing the next label in a row with Set Widget Position. If all you want is the label itself to hug its text, Fit Widget To Text does that in one node without you handling the number.

Pins

Text Widget — a text widget handle from Find Child Widget. Anything else — a panel, an image, an empty handle — measures 0 rather than failing.

Width (px) — physical screen pixels, so it is already in the same units as Set Widget Position and Set Widget Size on an exact-sized widget.

Example

Sizing a name plate around the name. Layout nameplate holds a panel Plate with a text widget Name inside it. On the client: overlay → Scale For ScreenSet Text on NameText Width of NameAdd 24 → Set Widget Size on Plate with that as the Width and a fixed Height. The plate is always the width of the name plus a margin.

Watch out

  • Measure last. The value reflects the text and the text size at that instant, so it must come after Set Text *and* after Scale For Screen — a width read before scaling is a 1080p number that lands wrong on a 1440p or 4K screen.
  • A width of 0 means "no text here": empty string, wrong widget class, or a Find Child Widget that found nothing. It is never an error you will see.
  • Client-side only: it can only run in a chain that is still on the player's machine, in a Server + Client project.

Values/Items

Count Items In Inventory

pureserverpure.countItemsOfType

Counts how many of an item type are anywhere in an entity's inventory (matches subtypes too).

Inputs
Containerentity
Item Classstringoptional
Outputs
Countint
Settings
Item ClassclassnamePickerrequired

Counts matching items anywhere inside a container. The search is deep: hands, worn clothing, every pocket of that clothing, a backpack and the bags inside the backpack — it walks the whole tree, not just the top level. Matching uses the engine's kind-of test, so subtypes count too. "Container" is anything with an inventory: a player, a tent, a barrel, a car, a corpse.

When to use it

Whenever a number of items decides something — an entry fee, a quota, "how many bandages is this player carrying". If you only need to know whether there is at least one, Has Item In Inventory says that more plainly. If you need the item itself, Find Item In Inventory. If you need to act on each one, loop with For Each Item In Inventory.

Do not confuse it with Get Item Quantity: that is how full *one* item is — rounds in a magazine, litres in a bottle — while this is how *many* items there are.

Pins

Item Class — the panel picker, or a wire that overrides it (a config value, so owners can retune the recipe without the editor).

Example

A hand-in counter at a crate: On Hold Interaction (Object Class SeaChest, prompt "Hand in rags", 4 seconds) → Count Items In Inventory (Container = the event's Player, Item Class = Rag) → Greater Than (B = 9) → Branch. On True, Remove Items Of Type (Rag, How Many = 10) then Give Item To Player (BandageDressing). On False, Send Notification "Bring me 10 rags".

Count first, then remove — checking beforehand is what lets you refuse politely instead of half-charging someone.

Watch out

  • The search is deep, so an item buried in a backpack counts exactly like one being worn. When "worn" is the real question, read the slot with Get Attachment In Slot.
  • Subtypes count: a base class name quietly sweeps in every variant.
  • Classnames are case-sensitive: GasMask, not Gasmask. A wrong name gives 0 forever with no error, which reads exactly like "they have none".
  • The container itself is included when it happens to match the type — Find Item In Inventory skips it, this does not.
  • An empty Container wire gives 0, so a lookup that failed upstream looks like an empty inventory.

Find Item In Inventory

pureserverpure.findItemOfType

The first item of a type anywhere in an entity's inventory (matches subtypes). Empty if none - check with Is Valid.

Inputs
Containerentity
Item Classstringoptional
Outputs
Itementity
Settings
Item ClassclassnamePickerrequired

The same deep inventory walk as Count Items In Inventory, but instead of a number it hands back the first matching item — a live reference you can damage, repair, fill, move or delete. Hands, worn clothing, pockets, nested bags: it all gets searched, and subtypes match.

"First" means first in the order the engine walks the inventory, not best or nearest. If a player carries a ruined bandage and a pristine one, which comes back is not something you choose.

When to use it

When you need the thing itself rather than a count or a yes/no — Count Items In Inventory and Has Item In Inventory answer those. Use For Each Item In Inventory when every match matters; it is also the only way to pick by condition.

Find Item On Player looks similar but is not the same node: it only searches a player, and it matches the exact class with no subtypes. Use that one when a base class must *not* sweep in variants.

Pins

Container — any entity with an inventory: player, tent, barrel, vehicle, corpse.

Item — the match, or empty when there was none. It is an entity, so item-only nodes like Get Item Quantity and Set Item Health need As Item in between.

Example

Warning players their gas mask is nearly gone: Every N Seconds (60) → For Each PlayerFind Item In Inventory (Container = the loop's Player, Item Class = GasMask) → Is ValidBranch. On True, As ItemGet Item Health (Health %) → Less Than (B = 0.3) → a second BranchSend Notification "Your gas mask is close to ruined".

The Is Valid check is not dressing: most players will not be carrying a mask at all, and everything after this node needs a real item.

Watch out

  • Empty is a normal answer — nothing matched, or the Container wire was itself empty. Gate with Is Valid before acting on it.
  • The search reaches into backpacks, so a mask stuffed in a bag is "found" as readily as one being worn. For worn gear only, read the slot with Get Attachment In Slot.
  • Classnames are case-sensitive: GasMask, not Gasmask. A misspelt class simply never matches.
  • Do not park the result in Remember Item for later. That handle reads back empty once the item is destroyed, and after a Delay only the player carries across — find the item again on the far side of the wait.
  • Matching the class does not prove the item is *yours*. Two identical barrels, one you spawned and one a player placed, are indistinguishable until you mark yours with Tag Item.

Get Attachment In Slot

pureserverpure.getAttachmentBySlot

The item attached in a named slot (e.g. weaponOptics, Shoulder), or empty if none. Slot names are exact — check the item config for the right one.

Inputs
Entityentity
Outputs
Attachmententity
Settings
Slot Nametext

Looks at exactly one attachment point and reports what is fitted there. Not "somewhere in the inventory" — *this slot*. Slots are how the game holds worn and mounted things: a player has "Mask", "Headgear", "Body", "Back"; a rifle has "weaponOptics" and "magazine"; a car has its battery and wheel slots. Ask by name and you get the item in it, or nothing when the slot is free.

This is the difference between carrying a gas mask and wearing one, and getting that distinction right is most of what this node is for.

When to use it

Whenever equipped state decides something: gas protection, "does this rifle have a scope", "does this car have a battery". Its opposites are Has Item In Inventory and Find Item In Inventory, which search the whole inventory including bags. To react the moment gear changes instead of polling, On Item Attached and On Item Detached hand you the item and the slot name directly.

Pins

Entity — whatever holds the slot: a player, a weapon from Get Item In Hands, a vehicle from Get Player Vehicle.

Slot Name — typed into the panel, exactly as the item's config spells it. Common ones are "Mask", "Headgear", "Body", "Back", "Shoulder", "weaponOptics", "magazine". Casing matters and there is no drop-down of valid names. Note the backpack slot is called "Back" — "Backpack" is not a slot the game knows, and asking for it just returns empty forever.

Attachment — the fitted item, or empty. It arrives as an entity, so item-only nodes need As Item first.

Example

A toxic zone a mask actually protects you from: While Player In Zone (Center 7500 0 7500, Radius 80, Every 5 seconds) → Get Attachment In Slot (Entity = the event's Player, Slot Name = "Mask") → Get Entity TypeText Equals (B = "GasMask") → Branch → on False, Damage Entity (Entity = the Player, Amount = 8) and Send Notification "The air is burning your lungs".

Swap that check for Has Item In Inventory and the zone becomes harmless to anyone with a mask buried in a backpack.

Watch out

  • Worn versus carried is the whole point. This never sees pockets, cargo or bags — only the named slot.
  • Slot names are exact and case-sensitive, and an unknown name returns empty rather than complaining. A typo looks identical to an empty slot, so when a check "never fires", suspect the name first.
  • Empty is a normal answer. Gate with Is Valid, or compare the type as above, before acting on the result.
  • The Entity pin is not guarded: when it can be empty — an empty-handed player out of Get Item In Hands — branch before this node, not after.
  • One slot per node; checking a full outfit means one node per slot.

Get Container Liquid

pureserverpure.getItemLiquid

What liquid a container holds: "Water", "Clean Water", "Vodka", "Beer", "Gasoline", "Diesel", "Disinfectant", "Saline", or "None". The counterpart to Set Container Liquid.

Inputs
Itementity
Outputs
Liquidstring

What a container is holding, as a readable word: "Water", "Clean Water", "Vodka", "Beer", "Gasoline", "Diesel", "Disinfectant", "Saline" or "None". The words match the list Set Container Liquid writes, so a read and a write line up.

Anything that is not a liquid container — and an empty wire — answers "None" rather than empty text, so there is always something to compare against.

When to use it

Telling apart things that look the same in a graph: pond water from clean water, gasoline from diesel in a canister. Pair it with Get Item Quantity, which answers the other half of the question — this node says *what*, that one says *how much*.

Example

A water purifier: On Hold Item Action (Item Class WaterBottle, prompt "Purify", 3 seconds) → Get Container Liquid (Item = the event's Item) → Text Equals (B = "Water") → Branch → on True, Set Container Liquid (Clean Water) → Send Notification "Purified". On False, Send Notification "Nothing to purify in there".

Watch out

  • "None" is the answer for an empty bottle, a non-container and an empty wire alike. It never comes back as blank text.
  • The names are compared exactly by Text Equals — "Clean Water" has a capital W and a space in the middle.
  • Type is not amount. A bottle can report "Clean Water" while holding nothing; check Get Item Quantity when the amount matters.

Get Display Name

pureserverpure.getItemDisplayName

The human-readable name of an item or object ("Hunting Knife" instead of "HuntingKnife").

Inputs
Entityobject
Outputs
Namestring

The name a player reads on screen — "Hunting Knife", not the classname "HuntingKnife". It is the same text the vanilla inventory shows, pulled straight from the item, so it reads naturally in a message without you keeping a list of pretty names anywhere.

When to use it

Anything a person will read: notifications, chat lines, kill feeds, logs. When you need the classname instead — for a comparison, a config lookup, or feeding another node's Item Class pin — that is Get Entity Type.

Example

On Item AttachedGet Display Name (Entity = the event's Item) → Join Text (First = "You put on ", Second = that name) → Send Notification (Player = the event's Player).

Watch out

  • Never wire this into a classname pin. "Hunting Knife" is not a class the game knows; Get Entity Type gives the name that is.
  • Different classes can share a display name, so it is no way to identify an item. Compare classnames for that.
  • An empty wire gives empty text rather than an error, which quietly leaves a hole in your message — check with Is Valid when the item comes from a search.

Get Food Stage

pureserverpure.getFoodStage

How a food item is cooked: "Raw", "Baked", "Boiled", "Dried", "Burned" or "Rotten". The counterpart to Set Food Stage. Empty for anything that is not food. Compare it with Text Equals.

Inputs
Itementity
Outputs
Stagestring

How a piece of food has been treated, as one word: "Raw", "Baked", "Boiled", "Dried", "Burned" or "Rotten". These are the same six words Set Food Stage offers, so reading and writing speak the same language. Anything that is not food — a rifle, a bandage, an empty wire — comes back as empty text.

When to use it

Cooking rules: pay for properly cooked meat, refuse raw or rotten food, make a stove that only works on Raw. Compare the result with Text Equals, which is an exact, case-sensitive match.

Cooking state is not temperature. A steak can read "Baked" and still have gone cold — that is Get Item Temperature.

Example

Punishing bad food: On Player ConsumedGet Food Stage (Item = the event's Item) → Text Equals (B = "Rotten") → Branch → on True, Give Disease (Player, Strength 100) and Send Notification "That was rotten — you feel unwell".

The same event fires when a player drinks from a pond, where Item is empty. Nothing needs guarding: the stage comes back empty and the comparison is simply false.

Watch out

  • Empty text means "not food" as well as "no item", so treat empty as "this rule does not apply" rather than as a stage.
  • Text Equals is case-sensitive. "Rotten" matches; "rotten" and "ROTTEN" never will.
  • Burned and Rotten are different states — burned is overcooked, rotten is spoiled. A rule about "bad food" usually needs both.

Get Item Container

pureserverpure.getItemContainer

What an item is directly inside (a backpack, a crate, a player...). Empty if it is on the ground.

Inputs
Itementity
Outputs
Containerentity

What an item is *directly* inside — one step up, no further. A rifle in a backpack answers with the backpack, not with the player wearing it. Something a player is holding or wearing answers with the player. Something lying on the ground answers empty.

When to use it

Telling "stored" from "dropped", checking that an item you spawned really landed inside the container you aimed at, or walking up a hierarchy one level at a time. When you want the person at the top of the chain no matter how deep the item is, Get Item Owner climbs the whole way in one node. To go the other direction — everything inside a container — loop with For Each Item In Inventory.

Pins

Container — an entity, and it can be almost anything: a backpack, a vest, a crate, a tent, a car, a player. Use Get Entity Type or Get Display Name to see what it turned out to be, or Cast To Player when you need it as a player.

Example

Logging where gear goes: On Item DetachedGet Item Container (Item = the event's Item) → Is ValidBranch. On True, Get Display Name (the container) → Log Message (Text = Join Text of "Stored into " and that name). On False, Log Message "Dropped on the ground".

Watch out

  • One level only. An item in a pouch inside a backpack reports the pouch, not the backpack and not the player.
  • Empty means "on the ground" — a perfectly normal answer, so gate with Is Valid before using the result.
  • The Item pin is not null-guarded; branch on Is Valid first when the item comes from a search that can come up empty.

Get Item Health

pureserverpure.getItemHealth

An item's health as a raw value and as a 0-1 percentage.

Inputs
Itemitem
Outputs
Healthfloat
Health %float
Settings
Zone (blank = whole item)text

An item's condition, in two forms. Health is the raw number the engine keeps, and its scale differs from item to item — a few hundred on one thing, thousands on another. Health % is that same value expressed from 0 to 1, where 1 is pristine and 0 is ruined. The percentage is almost always the one to compare against, precisely because it means the same thing on every item.

When to use it

Refusing ruined gear, pricing a repair, rewarding pristine loot, showing a condition bar. The counterpart is Set Item Health (Set Value, Set Percent, or Repair Full). For a creature, vehicle or world object, Get Entity Health gives the same 0-1 percentage from an entity pin and saves you a conversion.

Pins

Item — an item, strictly. An entity from Find Item In Inventory or Get Attachment In Slot needs As Item in between.

Zone (blank = whole item) — a named damage zone from the item's own config, mostly a vehicle thing. Leave it blank and you get the item as a whole, which is what you want nearly every time. A zone name must match the config exactly.

Example

A field-repair action: On Hold Item Action (Item Class M4A1, prompt "Field repair", 5 seconds) → Get Item Health (Item = the event's Item, Health %) → Greater Than (B = 0.25) → Branch. On True, Set Item Health (Mode "Repair Full") → Send Notification "Repaired". On False, Send Notification "This one is beyond saving".

Watch out

  • Compare the percentage, not the raw value. "Health below 50" means nothing consistent — on one item that is nearly ruined, on another it is a scratch.
  • The Item pin is not null-guarded. An empty wire errors in the server log instead of returning 0, so branch on Is Valid when the item comes from a search.
  • Condition is not fullness. A ruined bottle can still be full of water (Get Item Quantity).
  • A misspelt Zone name does not report the whole item — leave the field blank unless you have the exact name from the config in front of you.

Get Item Lifetime

pureserverpure.getItemLifetime

How many seconds until the cleanup system may remove a dropped item, and its full lifetime.

Inputs
Itementity
Outputs
Seconds Leftfloat
Max Secondsfloat

DayZ's central economy sweeps up dropped items after a while; this reads that clock. Seconds Left is how long this particular item still has before a cleanup pass may take it. Max Seconds is its full lifetime — normally the value the server's economy config gives that type, or whatever Set Item Lifetime last wrote, since that node sets both.

When to use it

Telling players how long event loot will stick around, deciding whether an item needs its clock topped up, and working out why something you spawned disappeared overnight.

To change the clock, Set Item Lifetime handles one item and Extend Loot Lifetime In Radius handles everything in an area at once.

Pins

Seconds Left and Max Seconds — both in seconds. Divide by 60 with Divide for minutes before showing them to anyone.

Example

An airdrop with a countdown. First the drop: On Server StartedSpawn Item (SeaChest at 4600 0 10300) → Set Item Lifetime (Seconds = 7200). Then a separate announcer: Every N Seconds (300) → For Each Object Near (4600 0 10300, radius 10) → Is Item Of Type (Item Class = SeaChest) → Branch → on True, As ItemGet Item Lifetime (Seconds Left) → Divide (B = 60) → To Whole NumberBroadcast Notification (Title = Join Text of "Airdrop despawns in " and that number).

The crate is found again each pass rather than remembered, because a stored item reference goes stale the moment the item does.

Watch out

  • Zero does not mean "gone this instant". It means the next cleanup pass may take it, and those passes run on the server's own schedule.
  • The clock belongs to the cleanup system, which is about items lying in the world — do not read anything into it for gear sitting in a player's inventory.
  • The Item pin is not null-guarded. Where the item comes from a search or a loop, gate it with Is Valid first.
  • Max Seconds is not a limit you set in your graph — Set Item Lifetime writes both numbers, so after it runs the two outputs read the same.

Get Item Owner

pureserverpure.getItemOwner

The player carrying an item (anywhere in their gear). Empty if it is on the ground - check with Is Valid.

Inputs
Itementity
Outputs
Ownerplayer

Climbs from an item all the way up to the person carrying it. However deep the item sits — a round inside a magazine inside a vest pocket — the answer is the player at the top of that chain. An item lying on the ground, sitting in a crate or riding in a car has no owner, and the Owner pin comes back empty.

When to use it

When you have the item but not the person. Loops over world objects, item-side events and searches all hand you things without saying whose they are. For the one step up instead of all the way — the pocket or bag the item is directly inside — use Get Item Container.

Pins

Item — an item or entity. As Item converts a loop's plain object into something this accepts.

Owner — a player, or empty. Empty is the normal answer for anything not on a person, so check it with Is Valid.

Example

Logging who picked up event loot: Every N Seconds (30) → For Each Object Near (4600 0 10300, radius 30) → As ItemGet Item OwnerIs ValidBranch → on True, Get Player NameLog Message (Text = Join Text of "Carrying event loot: " and that name).

Everything still lying on the ground falls to the False path, so the log only shows loot that someone has actually taken.

Watch out

  • Empty is normal, not an error. Anything on the ground, in a barrel, in a tent or in a vehicle has no owner.
  • The owner may be a corpse. A dead body keeps its gear until it despawns, so gate with Is Player Alive whenever a dead player must not count.
  • The Item pin is not null-guarded, and As Item returns empty for scenery — put Is Valid between them when the source is a loop over world objects.
  • Carrying is not owning. This tells you who holds the item now, never who spawned it or who it "belongs" to; for that, mark your items with Tag Item.

Get Item Quantity

pureserverpure.getItemQuantity

An item's current quantity, and the most it can hold.

Inputs
Itemitem
Outputs
Quantityfloat
Max Quantityint

How much is in an item, and how much fits. Quantity means whatever that item counts in: litres in a canteen or a fuel canister, portions of food in a can, rounds in a magazine, items in a stack. Max Quantity is the same measure when full, which is what turns the raw number into something you can show a player — divide one by the other for a 0 to 1 fullness.

Quantity is not condition. A canister can be brim-full and still ruined; that is Get Item Health.

When to use it

Trading and services priced by amount, "is this canteen empty" checks, topping things up. The counterpart is Set Item Quantity, which can Set, Add or Fill To Max. For a magazine, Get Magazine Ammo is the more dependable read — it names rounds explicitly and answers 0 safely for anything that is not a magazine.

Pins

Item — an item, strictly. Sources that hand you an entity — Find Item In Inventory, Get Attachment In Slot, For Each Item In Inventory — need As Item in between; the editor will not make that wire otherwise.

Max Quantity — capacity, not the current amount. Feed both into Divide for a fraction; dividing by zero safely gives 0, so an item with no quantity at all cannot break the maths.

Example

Selling fuel by the litre: On Hold Item Action (Item Class CanisterGasoline, prompt "Sell fuel", 3 seconds) → Get Item Quantity (Item = the event's Item) → To Whole NumberAdd To Player Number (Name "credits") → Send Notification (Title = Join Text of "Sold " and that number) → Set Item Quantity (Item = the same item, Mode Set, Amount 0).

The event's Item pin is already an item, so it wires straight in. Empty the canister *after* reading it — do it first and you will pay everyone nothing.

Watch out

  • The Item pin is not null-guarded. An empty wire is a script error in the server log, not a quiet 0 — gate searches with Is Valid and Branch.
  • Amount is not condition and not ammo count: Get Item Health and Get Magazine Ammo answer those.
  • Quantity is a decimal. Wire it through To Whole Number before anything that wants a whole number, and remember a "full" bottle can read a hair under its maximum.
  • Not every item has a quantity. Items that do not carry one report 0, which reads exactly like "empty".

Get Item Temperature

pureserverpure.getItemTemperature

An item's temperature in degrees. The counterpart to Set Item Temperature.

Inputs
Itementity
Outputs
Degreesfloat

An item's temperature in degrees, read straight off the item the same way the inventory screen reads it. Hot food is well above room temperature, frozen meat is below zero, and everything drifts back toward its surroundings on its own.

When to use it

Rewarding a hot meal, checking meat is properly frozen, building a stove or a fridge. The counterpart is Set Item Temperature, which is a one-time set the environment then pulls back. For how food was *cooked* rather than how warm it is now, use Get Food Stage; for how warm the player is, Get Heat Comfort.

Example

On Player ConsumedGet Item Temperature (Item = the event's Item) → Greater Than (B = 40) → Branch → on True, Send Notification "A hot meal — that will keep the cold off".

Watch out

  • The Item pin is not null-guarded here. Where the item comes from a search or a loop that can come up empty, put Is Valid and Branch in front of it rather than reading blindly.
  • Temperature moves on its own. A value read a minute after you set it will already have drifted.

Get Item Wetness

pureserverpure.getItemWetness

How wet an item is (0 = bone dry, 1 = soaked). The counterpart to Set Item Wetness.

Inputs
Itementity
Outputs
Wetnessfloat

How wet one item is, on a 0 to 1 scale: 0 is bone dry, 1 is soaked through. Rain, swimming and wet ground push it up; body heat and a fire bring it down. Soaked clothing is what makes a player cold, so this is the number behind a lot of "why am I freezing" complaints.

When to use it

Drying services, weather-driven warnings, a penalty for swimming in your gear. The counterpart is Set Item Wetness — an instant dry-off reward, for instance. The player-side effect of all that wetness is Get Heat Comfort.

Example

Every N Seconds (300) → For Each PlayerGet Attachment In Slot (Slot Name = "Body") → Get Item WetnessGreater Than (B = 0.7) → BranchSend Notification "Your shirt is soaked — find a fire".

Watch out

  • The scale is 0 to 1, not 0 to 100. A test against 50 is always false.
  • It reports one item. A dry jacket says nothing about soaked trousers or a wet backpack — check each slot you care about.
  • The Item pin is not null-guarded. Get Attachment In Slot comes back empty when the slot is bare, so branch on Is Valid first when a player might not be wearing anything there.

Get Magazine Ammo

pureserverpure.getMagazineAmmo

How many rounds a magazine currently holds, and the most it can hold. 0 for non-magazines.

Inputs
Magazineentity
Outputs
Roundsint
Max Roundsint

Rounds in a magazine right now, and rounds when it is full. It reads the magazine itself, so point it at the magazine — not at the rifle the magazine is in. Anything that is not a magazine, including an empty wire, answers 0 for both numbers instead of failing.

When to use it

Ammo economies: paying for full magazines, refusing empty ones, a "you are running dry" warning, or checking that a handout actually arrived loaded. The counterpart is Set Magazine Ammo (Set Count or Fill To Max).

To reach the magazine inside a weapon, pull it out of the weapon's "magazine" slot with Get Attachment In Slot first, then read that.

Pins

Magazine — the magazine item. A weapon wired in here reports 0, because a weapon is not a magazine.

Max Rounds — capacity. Comparing Rounds against Max Rounds keeps a rule working across every calibre instead of hard-coding 30.

Example

A reloading bench: On Hold Item Action (Item Class Mag_STANAG_30Rnd, prompt "Top up", 3 seconds) → Get Magazine Ammo (Magazine = the event's Item) → Less Than (A = Rounds, B = Max Rounds from the same node) → Branch → on True, Set Magazine Ammo (Mode "Fill To Max") → Send Notification "Magazine topped up". On False, Send Notification "Already full".

Both outputs come from one node here, which is what makes the same wiring work if you later point it at Mag_AKM_30Rnd.

Watch out

  • 0 means "empty magazine" and "not a magazine" alike. Max Rounds tells them apart: a real magazine reports its capacity even when empty, a rifle reports 0 for both.
  • Reading the weapon does not include the round in the chamber — the chamber is not part of the magazine.
  • Safe on an empty wire, so no guard is needed before it. That also means a failed lookup quietly reads as an empty magazine.

Has Item In Inventory

pureserverpure.hasItemOfType

True when at least one item of a type is anywhere in an entity's inventory (matches subtypes).

Inputs
Containerentity
Item Classstringoptional
Outputs
Has Itbool
Settings
Item ClassclassnamePickerrequired

The yes/no form of Count Items In Inventory — it is literally that count tested against zero. Same deep walk through hands, worn clothes, pockets and nested bags; same subtype matching; same forgiving behaviour when the container wire is empty (the answer is just false).

When to use it

Any gate that only cares whether the player has one: an entry requirement, a hand-in, a "do you have a key" check. Wire it straight into Branch.

Pick a sibling when the question is really something else. Count Items In Inventory when the number matters. Find Item In Inventory when you need the item to act on. Get Attachment In Slot when "has" actually means "is wearing".

Pins

Container — a player, a tent, a barrel, a vehicle, a corpse: anything with an inventory.

Item Class — the panel picker, or a wire that overrides it.

Example

A supply hand-in: On Hold Interaction (Object Class SeaChest, prompt "Hand in supplies", 4 seconds) → Has Item In Inventory (Container = the event's Player, Item Class = Morphine) → Branch. On True, Remove Items Of Type (Morphine, How Many = 1) → Add To Player Number (Name "credits", Amount 50) → Send Notification "Thanks — 50 credits". On False, Send Notification "I only pay for morphine".

Watch out

  • This is the node behind the classic gas-zone bug. A GasMask sitting in a backpack answers true and the player takes no damage while breathing freely. If the item must be *worn*, read the slot with Get Attachment In Slot ("Mask") instead — a mask in a pocket protects nobody.
  • Subtypes count, so a base class name answers true for every variant of it.
  • Classnames are case-sensitive: GasMask, not Gasmask. A wrong name is false forever, which is indistinguishable from an honest "they don't have it".
  • An empty Container wire answers false, so a failed lookup upstream silently becomes "no".

Is Item Of Type

pureserverpure.isItemOfType

True when an item (or object) is of a type — subtypes count too. Pair it with Get Item In Hands to check what a player is holding. Empty items are simply false.

Inputs
Itemobject
Item Classstringoptional
Outputs
Is That Typebool
Settings
Item ClassclassnamePickerrequired

Asks one thing about one object: "is this an X?" The test is the engine's own kind-of check, the same one vanilla uses to decide whether a thing fits a slot, so it counts descendants as well as exact matches. Ask for Mag_STANAG_30Rnd and you get exactly that magazine; ask for a base class like Weapon_Base and every firearm answers true. An empty wire is simply false, so this is safe to put in front of anything.

When to use it

As a filter. Loops and events hand you "an object" without saying what it is — For Each Object Near gives you trees and buildings alongside loot, On Held Item Changed gives you whatever came to hand. This node turns that into a yes/no for Branch.

Reach for Get Entity Type instead when you want the classname as text to show or log, and for Has Item In Inventory when the question is about a whole inventory rather than one object.

Pins

Item — any object: an item, a creature, a building, a vehicle. It does not have to be an inventory item.

Item Class — the panel's classname picker, or a wired text value which overrides it. Wiring it from Get Config Text lets an owner change what your graph looks for.

Example

Keeping trader barrels from being cleaned up: Every N Seconds (60) → For Each Object Near (position 4600 0 10300, radius 40) → Is Item Of Type (Item = the loop's Object, Item Class = Barrel_Green) → Branch → on True, As Item (the same Object) → Set Item Lifetime (Seconds = 7200).

The loop hands out plain objects — the road, a fence, a tree — so the type test is what keeps the rest of the chain off scenery. As Item is there because Set Item Lifetime wants an item and a loop object is not one yet.

Watch out

  • Classnames are case-sensitive: GasMask, not Gasmask. A mis-cased name answers false forever and nothing warns you — take names from the picker.
  • Subtypes count. Usually what you want ("is this any kind of rifle"), but a specific-sounding class also matches variants of itself.
  • False is also the answer for an empty wire, so false means "not that type or nothing there". Is Valid tells those apart.
  • Being the right type says nothing about where the item came from. To recognise something your own graph spawned, tag it with Tag Item and read it back with Get Item Tag.

Values/Logic

And

purebothpure.and

True only when both A and B are true.

Inputs
Abool
Bbool
Outputs
Resultbool

True only when both A and B are true. It lets one Branch decide on two conditions at once, instead of stacking two Branches in a row — a flatter graph with a single place to wire the exec.

When to use it

Whenever an action needs two things to hold at the same time: outside the zone *and* alive, has the key *and* the door is closed. For three or more conditions, chain a second And onto the first. When *either* condition should be enough, use Or.

Example

Punishing players who stray outside an arena. Under For Each Player: Get Player PositionDistance Between (B = the arena center) → Greater Than (B = the arena radius) feeds one side, and Get Player HealthGreater Than (B = 0.5) feeds the other → AndBranch — only living players outside the ring collect a strike. The health check is there because For Each Player still includes dead bodies until they despawn; a corpse can lie outside the arena without being punished for it.

Equals (Numbers)

purebothpure.equals

True when A and B are the same number.

Inputs
Afloat
Bfloat
Outputs
Resultbool

True when A and B are exactly the same number. Built for counters, indexes and stored flags — values that move in clean whole steps.

When to use it

Exact matches: a kill counter hitting a milestone, an index matching a slot, a stored mode number equal to 2. For text, use Text Equals instead — this node compares numbers only. For "has reached or passed", prefer Greater Than / Less Than: a value that moves in steps bigger than 1 can jump straight over an exact mark and an Equals check never fires.

Example

Announcing a round winner exactly once, when the round timer runs out:

For Each PlayerGet Saved Player Number ("round_kills") → Equals against Get Saved Number ("best_kills") — that finds the leader — And-ed with an Equals (B = 0) on a saved "winner_announced" flag → BranchBroadcast Notification "Round winner", then Set Saved Number ("winner_announced", 1).

The second Equals is the interesting one: a flag that reads 0 until the announcement goes out turns a broadcast that could fire on every tied player into one that fires once. Kill counts step by whole numbers, so an exact comparison is safe here.

Watch out

Decimals rarely land exactly. A number that has been through Divide, Blend Numbers (Lerp) or health/stat getters can be 19.999999 — visually 20, never equal to 20. Compare whole values (run both sides through To Whole Number) or test a band with Greater Than / Less Than. Counters that only ever step by 1 are always safe.

Greater Than

purebothpure.greaterThan

True when A is greater than B.

Inputs
Afloat
Bfloat
Outputs
Resultbool

True when A is greater than B. The comparison you will use most — nearly every Branch condition starts here.

One idiom worth learning early: stored flags in NodeZ are numbers, so "is the flag on" is written as the flag Greater Than 0.5. Testing against 0.5 rather than 1 is deliberate — it reads the same whether the flag was stored as 1, 2 or anything else non-zero.

When to use it

Thresholds of any kind — distance past a radius, health above zero, score above the record. The check is *strictly* greater: A equal to B gives false. There is no "greater or equal" node; when equal must also pass, use Not on Less Than.

Example

The flag idiom: Get Global Number (mask_ok) → Greater Than (B = 0.5) → Branch — reading a stored 0/1 flag as yes/no before deciding whether the player bleeds.

The threshold idiom, to find players who have wandered out of an arena: Every N Seconds (5) → For Each PlayerDistance Between (the player's position, the arena centre) → Greater Than (B = 400) marks a player outside the ring. Feed that and Is Player Alive into AndBranch, so a corpse lying outside the ring is not punished every five seconds.

Health is a threshold too, but on its own scale: Get Player Health counts 0 to 100, so Get Player HealthGreater Than (B = 25) reads "still above a quarter health" — nothing like the 0.5 of the flag idiom.

Watch out

  • A corpse is still a player. For Each Player and For Each Player Near hand you dead bodies until they despawn. Gate those loops with Is Player Alive rather than comparing health: alive or dead is a state the engine answers directly, while a threshold only guesses at it.
  • Know the scale before you pick B. 0.5 belongs to the flag idiom and is not a health number — Get Player Health runs 0 to 100 while Get Entity Health runs 0 to 1, so the same B asks a different question of each.
  • Comparing a random roll re-rolls it. Random Number hands out a fresh number at every wired use, so the roll you compared here is not the one read again downstream (the editor warns). Store one roll with Set Global Number and compare that, or use Random Chance when a percentage is all you want.

Is Valid

purebothpure.isValid

True when the value points at something real (not empty). Use it with Branch to check a Killer or Attacker actually exists.

Inputs
Valueentity
Outputs
Is Validbool

Many pins hand you "maybe something": a Killer that may not exist, a found item that may not be there, a cast that may have failed. Is Valid is the test — true when the wire actually points at something real, false when it is empty. In the generated Enforce it is a plain null check, the same guard hand-written mods use before touching any object.

When to use it

Before trusting any output that can legitimately be empty:

Wire the result straight into a Branch and put the risky work on the True side.

Example

On Player DiedIs Valid (Killer) → Branch — the reward on the True side only pays out when a real killer exists, so bleed-outs, falls and menu respawns hand out nothing. This is the wiring in the Kill reward template (File → New from template), where the True side gives the killer a Rag and sends them a notification.

The same guard belongs on the Attacker: On Player Took DamageIs Valid (Attacker) → Branch before recording who hit whom last, or a fall down a ladder overwrites the real attacker with nothing.

Watch out

  • In damage and death events the raw engine source is often the weapon, not the shooter. NodeZ already resolves that to the player holding it — but when there is no such player (environment deaths, suicide), the pin is empty, and this node is how you find out. Check it before building a killfeed line.
  • Remember Item is a weak handle: Remember Item does not keep an item alive, so a stored reference can silently turn empty later. Is Valid before every use, not just the first.

Less Than

purebothpure.lessThan

True when A is less than B.

Inputs
Afloat
Bfloat
Outputs
Resultbool

True when A is less than B — the mirror of Greater Than.

When to use it

"Below the line" checks: health low, stock short, time nearly out. The flag idiom works backwards here too: a stored 0/1 flag Less Than 0.5 reads as "the flag is off", which is how you keep retrying something until it succeeds — a spawn_found flag tested that way keeps a loop trying spawn points until one is accepted. The check is strictly less: equal values give false, so build "less or equal" as Not on Greater Than.

Example

Padding a round clock so it reads 12:07 and not 12:7. The two halves live in globals, clock_minutes and clock_seconds, and a timer announces them.

Every N Seconds (1) → Branch, with the Branch's Condition wired from Less Than (A = Get Global Number "clock_seconds", B = 10). The True path runs an Broadcast Notification whose Title comes from a pair of Join Text nodes: the first has First ":0" and Second the seconds, the second has First the minutes and Second the text the first one made. The False path runs a second Broadcast Notification with its own pair, identical except that the first Join Text's First is ":".

Two chains, not one. Join Text is a value node with no trigger pin, so a Branch arm cannot be run into it — only the notifications sit on the trigger path, and each pulls its Title from its own pair. Put To Whole Number between each Get Global Number and the text pins: globals are decimals and you want whole digits on screen.

Not

purebothpure.not

Flips true to false and false to true.

Inputs
Valuebool
Outputs
Resultbool

Flips true to false and false to true. Small, but it is how "same" becomes "different", "has" becomes "lacks", and how the missing ≥ / ≤ comparisons get built (Not on Less Than is "greater or equal").

When to use it

Any time the check you can build is the opposite of the check you need. Rather than rearranging a whole condition, bolt a Not on the end.

Example

Recording who landed the last hit. Under On Player Took Damage, both players' Get Player Steam Id results meet in Text EqualsNot — "the attacker is not the victim" — which is And-ed with Is Valid on the attacker, and that feeds a Branch whose True side runs Set Player Text (Player = the victim, Value = the attacker's Steam Id). Without the Not, shooting yourself would credit you as your own attacker.

Or

purebothpure.or

True when A or B (or both) are true.

Inputs
Abool
Bbool
Outputs
Resultbool

True when A or B is true — or both. One Branch can then act when *either* condition holds.

When to use it

"Any of these reasons" checks: warn when it is dark or a storm is up, unlock for admins or donors. Its partner And wants both sides true; Not flips a side before it comes in ("not wearing a mask OR mask is ruined").

Example

A nightly danger warning on a timer: Is Night into A, Get Weather LevelGreater Than (B = 0.7) into B → OrBranchBroadcast Notification ("Visibility is poor — stay near shelter").

Values/Math

Absolute Value

purebothpure.absolute

The value with any minus sign removed (-5 becomes 5).

Inputs
Valuefloat
Outputs
Resultfloat

Strips the minus sign off a number: -5 comes back as 5, and 5 stays 5. It is the engine's own absolute-value call, and it is how you ask "how big is this difference" without caring which way the difference went.

When to use it

After a Subtract, when you want the size of a gap rather than its direction — how far a value has drifted from a target, how far apart two counts are. You do not need it for distances between two positions: Distance Between already gives a positive number of metres.

Example

Warning anyone whose health has drifted more than five points either side of half: Get Player HealthSubtract (B = 50) → Absolute ValueGreater Than (B = 5) → BranchSend Notification. Without the Absolute Value the check only ever catches players above 50, because a player at 30 produces -20 and -20 is not greater than 5.

Watch out

The Result is a decimal. A pin that counts things — a Repeat count, a list index — needs To Whole Number after it.

Add

purebothpure.add

Add two numbers.

Inputs
Afloat
Bfloat
Outputs
Resultfloat

Adds A and B and gives the Result. The plainest building block there is — scores, totals, stepping an index forward.

When to use it

For a one-off sum that feeds another pin. When the goal is "make a stored number go up", reach for Add To Global Number, Add To Player Number or Add To Saved Number instead — they add and store in one step; this node only computes a value.

Example

Picking a new arena out of four without ever redrawing the one currently in play: Random Number (Min 0, Max 3) → Add (B = 1) → the result is a step of 1, 2 or 3, which you add to the index of the arena in play before wrapping it back into range. Adding 1 is what makes it work — the raw random can come out 0, and an offset of 0 means "the same arena again".

Blend Numbers (Lerp)

purebothpure.lerp

A number between From and To. Amount 0 gives From, 1 gives To, 0.5 the middle.

Inputs
Fromfloat
Tofloat
Amount (0-1)float
Outputs
Resultfloat

Slides between two numbers. Amount 0 gives you From, 1 gives you To, 0.5 the midpoint, 0.25 a quarter of the way along. It is the engine's own Lerp, the call vanilla uses whenever a value has to fade smoothly from one figure to another.

The mental model is a dial that runs from 0 to 1, and this node turns a dial position into a real number in whatever range you name. That makes it the natural partner of anything you can express as "a fraction of the way through": a distance divided by a maximum distance, a countdown divided by its starting value, a health percentage divided by 100. Getting that fraction is Divide's job; turning it back into a useful quantity is this node's.

When to use it

Whenever a 0-to-1 fraction has to become a real quantity — damage that eases off with distance, a reward that scales with rank, a timer bar that shrinks. Note that From is allowed to be larger than To: that is exactly how you invert a scale, so a fraction that grows produces a number that shrinks.

Example

Radiation that hurts more the closer you get to the middle of a zone. While Player In ZoneDistance Between (the event's Player position to the zone center) → Divide (B = 120, the zone's radius) → Blend Numbers (Lerp) (From = 15, To = 2, Amount = that fraction) → Damage Entity as the amount. At the rim the fraction is 1 and the tick is 2; standing dead centre the fraction is 0 and the tick is 15. Change the two numbers and the whole curve changes, with no other rewiring.

Watch out

  • Amount is meant to sit between 0 and 1, and nothing in the node forces it there. When the amount comes from a live measurement rather than a fixed value, put Clamp Number (Min 0, Max 1) in front rather than relying on what the engine does with an out-of-range blend — a player standing 300 m from the centre of a 120 m zone produces an amount of 2.5.
  • The Result is a decimal; whole-number pins need To Whole Number after it.

Clamp Number

purebothpure.clamp

Keeps a number within a min and max range.

Inputs
Valuefloat
Minfloat
Maxfloat
Outputs
Resultfloat

Holds a number inside a floor and a ceiling. Below Min you get Min, above Max you get Max, and anything in between passes through untouched. It is the engine's own Clamp — the same guard vanilla puts on health, blood and stamina before writing them.

Think of it as the last thing a computed number passes through before it reaches something that cares. Arithmetic on config values and player input goes wrong in ways you cannot predict; a clamp turns "wildly wrong" into "pinned at the edge", which the server survives.

When to use it

In front of any pin with a fixed valid range — a percentage, a quick bar slot, a quantity — whenever the value was calculated rather than typed. To limit one side only, use Min / Max: "Larger (Max)" against 0 is a floor, "Smaller (Min)" against a cap is a ceiling. To keep an index inside a list, Remainder (Modulo) is usually better, because it wraps around to the start instead of stopping at the last entry.

Example

A config-driven arena where the owner sets the health players spawn on: On Player ReadySet Player Health, with Get Config Number ("start_health") → Clamp Number (Min = 1, Max = 100) wired into the health pin. A typo of 1000 in config.json then arrives as 100, and a 0 arrives as 1 instead of spawning everyone dead.

Watch out

  • Nothing checks that Min is below Max. Swap them by accident and the output stops meaning anything, with no warning from the editor.
  • A clamp hides a broken input as well as protecting from it. If a value sits at Max forever, the fault is upstream — the clamp is only the last thing that touched it.
  • The Result is a decimal. A whole-number pin still needs To Whole Number after the clamp, and clamping does not convert the type.

Direction A To B

purebothpure.directionBetween

A unit direction vector pointing from A toward B.

Inputs
Fromvector
Tovector
Outputs
Directionvector

A direction of length exactly 1 pointing from A toward B — pure aim, with the distance stripped out. That normalised length is what makes it composable: scale it by any number and you get exactly that many metres toward B.

When to use it

Any "toward" construction: push a point toward a player, place something between two spots, aim an effect. Pair with Scale Vector for a distance, and get how far apart A and B actually are separately with Distance Between. For the way a player is *facing* (rather than the line between two points), use Get Player Direction.

Example

Get Player Position (A) and Get Entity Position of a crashed helicopter (B) → Direction A To BScale Vector (Factor = 50) → Split Position → into Offset Position on the player's position: a spot fifty metres from the player, on the line toward the wreck.

Distance Between

purebothpure.distance

The distance in metres between two positions.

Inputs
Avector
Bvector
Outputs
Metersfloat

The straight-line distance in metres between two positions — the same measurement the engine itself uses, height included.

When to use it

On-demand radius checks: is this player inside the ring, is the wreck close enough, how far did the shot travel. For "a player stepped into / out of an area" you usually want the zone events (Player Entered Zone, Player Left Zone) instead — they watch continuously so you do not have to poll. To count people in a radius use Count Players Near; for the gap to the closest player use Distance To Nearest Player.

Example

An out-of-bounds sweep for an arena centred on 7500 0 7500 with a 400 m ring:

Every N Seconds (5) → For Each PlayerGet Player Position into A of Distance Between, the arena centre into B → Greater Than (B = 400) → And with Is Player AliveBranchSend Notification "Return to the arena".

The alive check is what makes the sweep usable: corpses stay in the player list for a while, so without it every dead body outside the ring is warned again on every tick. Feed the Branch into a Counter rather than a notification when you want three strikes before a kill.

Watch out

It is a 3D measurement: height counts. A player 150 m up a radio mast directly over a point is 150 m from it. That is almost always what you want; when you need flat map distance, zero both heights first with Split Position and Make Position.

Distance To Nearest Player

pureserverpure.nearestPlayerDistance

How far the closest living player is from a position. Wire a player into Ignore to leave them out — that is how you test whether a spawn point is clear of EVERYONE ELSE. With nobody else around it gives a very large number, so a "far enough?" test passes on an empty server.

Inputs
Positionvector
Ignore Playerplayeroptional
Outputs
Metersfloat

How far the closest *living* player is from a position, in metres. The generated code walks every player on the server, skips the dead and anyone you told it to ignore, and returns the smallest distance — one node instead of a loop you would otherwise build yourself.

When to use it

Clear-spot tests before placing something: is this spawn point far enough from everyone, is anyone close enough to hear this, should the airdrop move elsewhere. For the distance between two *known* points use Distance Between; to get the closest player as a person rather than a number, use Get Nearest Player; to count heads in a radius, Count Players Near.

Pins

Ignore Player — a player to leave out of the search. Wire in the player you are placing, and the node answers "how far is everyone *else*" — without it, measuring from a player's own position always gives 0.

Example

Picking a respawn point nobody is standing on. Repeat (Times 14) tries up to 14 candidates: inside the body, Random Point Near (the arena centre, radius 400) is stored with Set Global Position (spawn_candidate), then read back with Get Global Position into Distance To Nearest Player (the spawning player wired into Ignore Player) → Greater Than (40) → Branch, and the True side runs Get Global Position (spawn_candidate) → Teleport Player. The first candidate clear of everyone else wins. Keep the largest distance seen so far in a Set Global Number alongside it, and when all 14 come back crowded you can still send the player to the most isolated one instead of the last one rolled.

Watch out

  • With nobody else online (or everyone ignored) it returns a very large number — 999999 in the generated code. A "far enough?" test therefore passes on an empty server, which is usually right; but an "is someone nearby?" alarm must expect the huge value, not treat it as an error.
  • Corpses do not count. Unlike For Each Player, which includes dead bodies until they despawn, this node only measures living players — no alive-check needed.

Divide

purebothpure.divide

Divides A by B. Dividing by zero safely gives 0 instead of crashing.

Inputs
Afloat
Bfloat
Outputs
Resultfloat

Divides A by B and gives a decimal Result. Unlike raw Enforce, it is safe: the generated code checks the divisor first, and B of 0 gives 0 instead of a server error.

When to use it

Ratios, averages, unit conversion — seconds into minutes, damage into a percentage. For the *remainder* of a division use Remainder (Modulo); to turn the decimal result into a whole number, follow with To Whole Number.

Example

A round clock, built from a countdown in seconds: seconds remaining → Divide (B = 60) → To Whole Number gives the minutes, while Remainder (Modulo) (B = 60) on the same seconds gives the seconds — together they format 754 as 12:34.

Divide alone gives 12.566…; To Whole Number cuts that to 12, and the modulo hands back exactly what the cut threw away. That pairing is the whole trick to any "big unit / small unit" display.

Watch out

  • Dividing by zero gives 0 by design. That protects the server, but it also means a broken divisor — say a config value someone left at 0 — shows up as "everything is 0", not as an error. If a chain is producing nothing but zeroes, check the B side.
  • The result is a decimal. Pins that want a whole number (a Repeat count, a list index) need To Whole Number in between — the editor will not wire a decimal into them directly.

Make Position

purebothpure.makeVector

Builds a map position from X, Y (height) and Z.

Inputs
Xfloat
Yfloat
Zfloat
Outputs
Positionvector

Builds a map position from three numbers. X runs east, Z runs north, Y is height above sea level — the same order map tools and mission files use.

When to use it

Hard-coding a spot in the graph, or assembling a position from numbers you computed. For positions that server owners should be able to change, prefer a config field (Get Config Position) or text parsing (Text To Position). When you do not know the terrain height, leave Y at 0 and follow with Snap To Ground. The reverse node is Split Position.

Example

Make Position (7500, 0, 7500) → Snap To GroundTeleport Player — drop a player at the centre of Chernarus without having to guess the hill height there.

Min / Max

purebothpure.minOrMax

Returns the smaller or the larger of two numbers.

Inputs
Afloat
Bfloat
Outputs
Resultfloat
Settings
Pickselect · Smaller (Min) | Larger (Max) · default "Smaller (Min)"required

Compares two numbers and hands back one of them: the lower one with Pick set to "Smaller (Min)", the higher one with "Larger (Max)". One dropdown, two nodes' worth of behaviour — and the setting is easy to read backwards, so it is worth saying plainly: Min gives you the SMALLER number.

When to use it

One-sided limits. "Larger (Max)" against 0 is a floor, for a figure that must never go negative. "Smaller (Min)" against a cap is a ceiling, for a payout that must never exceed the pot. When you need both ends at once, Clamp Number does it in one node. And when you want to know *which* of two numbers is bigger rather than what the bigger value is, use Greater Than into Branch instead.

Example

A prize pot split between everyone online that never pays out less than 50: Divide (A = 1000, B = Get Online Player Count) → Min / Max (Pick = "Larger (Max)", B = 50) → the reward amount. With five players online the share is 200 and passes straight through; with thirty players the share works out at 33 and the floor lifts it back to 50.

Watch out

  • Check the Pick dropdown when a limit behaves inside out. "Larger (Max)" sounds like a maximum but it is what enforces a *minimum*, because it refuses to return anything below B.
  • The Result is a decimal, so whole-number pins still need To Whole Number.

Multiply

purebothpure.multiply

Multiply two numbers.

Inputs
Afloat
Bfloat
Outputs
Resultfloat

Multiplies A and B. Scaling, unit conversion, "per player times players".

When to use it

Turning one unit into another (minutes into seconds, a fraction into a percent) or scaling a reward. To multiply a whole position rather than a number, use Scale Vector.

Example

Turn a config value written in minutes into the seconds a countdown wants: Get Config Number (round_minutes) → Multiply (B = 60) → Set Global Number (seconds_left).

Offset Position

purebothpure.offsetVector

Shifts a position by an amount on each axis. Connect a Position, then X / Y / Z move it that many metres (Offset X = 5 moves it 5m east). Y is height. Leave an axis at 0 to keep it unchanged.

Inputs
Positionvector
Offset Xfloat
Offset Y (height)float
Offset Zfloat
Outputs
Positionvector

Takes a position and shifts it a number of metres along each map axis. It is the everyday way to say "just above", "a little beside", "two metres north of" — connect a position, type the offsets, done.

When to use it

Placing something relative to a position you already have: an item hovering over a body, a marker beside a door, a creature spawn behind a building. For "shifted toward a *specific other point*" build the offset from Direction A To B + Scale Vector instead, and for a *random* nearby point use Random Point Near.

Pins

Position — wire-only on purpose: connect a real position (Get Player Position, Get Entity Position, Make Position…). There is no type-in box here because a typed-in value cannot take part in the position arithmetic.

Offset X / Offset Y (height) / Offset Z — metres east, up and north. Negative values go west, down and south. An axis left at 0 is unchanged.

Example

A death drop that hovers over the body: On Player Died → the victim's Get Player PositionOffset Position (Offset Y = 1.1) → Spawn Item (Grenade_RGD5) with Placement set to "Floating in place". The 1.1 metres is chest height, so the pickup sits in plain sight above the corpse instead of inside it, and "Floating in place" is what stops it dropping back to the ground.

Watch out

Offsets follow the map's compass axes, not the way anyone is facing: Offset X = 5 is five metres *east* no matter where the player looks. For "in front of the player", take Get Player DirectionScale VectorSplit Position and wire those three numbers in as the offsets.

Power

purebothpure.power

Base raised to the Exponent (2^3 = 8).

Inputs
Basefloat
Exponentfloat
Outputs
Resultfloat

Base multiplied by itself Exponent times: base 2 with exponent 3 is 8. Exponent 2 squares a number, 3 cubes it, and 0.5 is the square root — though Square Root says that more plainly and is easier to read in a graph.

When to use it

Curves that get steeper the further out you go: a fine that bites harder the deeper into a restricted area someone strays, a cost that climbs faster with each purchase, radiation that stays mild at the rim and vicious at the middle. It is the mirror of Square Root, which flattens. For plain repeated addition — five times as much, twice as much — use Multiply; Power is only worth reaching for when you want the growth itself to accelerate.

Example

Damage that grows with the square of the distance past a boundary. Distance Between (player to the safe-zone center) → Divide (B = 100) → Power (Exponent = 2) → Multiply (B = 20) → Clamp Number (Min 0, Max 100) → Damage Entity as the amount. At 100 m out that is 20 damage a tick, at 200 m it is 80, and the clamp stops the far end of the map from producing an absurd number.

Watch out

  • Exponents compound very fast. A base in the hundreds with an exponent of 3 is already in the millions, far past anything a health, blood or quantity pin should ever see — put a Clamp Number after it whenever the base comes from something a player can influence.
  • A negative Base with a fractional Exponent has no real answer; keep the base at zero or above.
  • The Result is a decimal, so whole-number pins still need To Whole Number.

Random Chance

purebothre-rolls per usepure.randomChance

Randomly true this percent of the time (0 = never, 100 = always).

Inputs
Percentfloat
Outputs
Successbool

A weighted coin flip. Percent 25 comes back true roughly one time in four, 100 always, 0 never. It rolls a fresh number every time it is asked, and compares that roll against the percentage you gave it.

When to use it

Anywhere you want "sometimes": a rare bonus on a kill, a chance of an extra item in a crate, an event that only fires now and then. It answers yes or no, so its natural home is the condition pin of Branch. When you need a random *number* instead, use Random Number; to pick a random entry out of a config list, Random Config Text does the roll for you.

Example

A one-in-ten chance of a bonus on top of the normal kill reward. On Player DiedBranch, with Random Chance (Percent = 10) wired into the Branch's condition. The True path gives the killer something extra with Give Item To Player; the False path is left empty, which is a perfectly good half of a branch.

To let the server owner tune the rate without opening the editor, add a number field called "bonus_chance" in the Config panel and wire Get Config Number into Percent instead of typing 10.

Watch out

  • It re-rolls at every place it is wired. Two nodes fed from one Random Chance get two independent flips, and the editor warns you about it. Wire it into exactly one thing — normally a Branch — and hang everything that depends on the outcome off that Branch's two paths.
  • A percentage typed into the node is held between 0 and 100. A *wired* percentage is not checked at all: anything at or above 100 is always true and anything at or below 0 never fires, silently, which is exactly what a config value left at its default 0 will do.
  • The roll happens wherever that part of the chain runs. Under a client event — On Key Pressed, On Button Clicked — the flip happens on the player's own machine before the chain hands off to the server. That is fine for a cosmetic effect and wrong for anything valuable; put the roll after the chain has reached a server action.

Random Number

purebothre-rolls per usepure.randomInt

A random whole number from Min up to (but not including) Max.

Inputs
Minint
Maxint
Outputs
Resultint

A random whole number from Min up to but *not including* Max. Min 1 with Max 7 is a six-sided die. Min 0 with Max 4 gives 0, 1, 2 or 3 — which happens to be exactly the set of valid positions in a four-entry list, and that is why the range is built this way.

When to use it

Rolling an amount, choosing a spawn point, and above all picking a list index. Where the list lives in the Config panel and you only need one value from it, Random Config Text and Random Config Position do the pick in a single node. Reach for Random Number when you need the index *itself* — because two parallel config lists only stay in step if both are read at the same position. For a plain yes/no roll use Random Chance; for a random spot on the map, Random Point Near.

Example

Two config text lists describing the same kits — "kit_weapons" holding AKM, M4A1, Aug and "kit_ammo" holding Mag_AKM_30Rnd, Mag_STANAG_30Rnd, Mag_AugStanag_30Rnd. The roll happens once and is stored on the player: On Player ReadySet Player Number (Name "kit"), with Random Number (Min = 0, Max = Config List Count of "kit_weapons") wired into its Value.

Further down the same chain, Get Player Number ("kit") → To Whole Number feeds the Index pin of two Get Config Text At nodes, one per list, and those results go into the Weapon Class and Magazine pins of Give Weapon. The weapon and its magazine always come from the same row, because both read the one stored roll.

Watch out

  • Max is excluded. Wire the list count straight into Max with Min 0 and every index is reachable; use the count as Max with Min 1 and the last entry can never be picked.
  • It re-rolls at every place it is wired. Feeding two Get Config Text At nodes directly from one Random Number reads two different rows — an AKM with STANAG magazines — and the editor warns about it. Store the roll once and read it back, as above.
  • Store it on the player rather than globally when a Delay sits anywhere in the chain. A global written before the wait can be overwritten by another player's event while you wait, and the kit that lands is then somebody else's. A per-player number is safe from that; a saved one (Set Saved Player Number) also survives a restart.
  • Min and Max are whole-number pins. A decimal source — a config value, a Divide result — has to pass through To Whole Number first.

Random Point Near

pureserverre-rolls per usepure.randomPointNear

A random ground position within a radius of a center point. Re-rolls each time it is used — feed it into one node, or wire it once.

Inputs
Centervector
Radiusfloat
Outputs
Positionvector

Picks a random spot within a radius of a center point and puts it on the ground for you. It chooses a random compass direction and a random distance out from the center, then looks up the terrain height at that spot and sets the position's height to match — so the result is already grounded and does not need Snap To Ground afterwards.

When to use it

Scattering things instead of stacking them: several crates around a drop site, infected around a point of interest, a spawn that lands *somewhere near* a place rather than exactly on it. When you want a fixed offset rather than a random one, Offset Position moves a position by a set number of metres on each axis.

Example

An airdrop that scatters its contents. On Server StartedRepeat (Times = 6) → Spawn Item, with Random Point Near (Center = the drop position, Radius = 15) wired into the spawn's position. Each pass through the loop asks for a fresh point, so the six crates land spread around the site instead of inside one another.

The same shape works around a player: Get Player PositionRandom Point Near (Radius = 30) → Spawn Infected or Animal, for infected that arrive nearby rather than on top of someone.

Watch out

  • It gives a different point every place it is wired. Feeding one Random Point Near into both a spawn and a notification produces two unrelated positions, and the editor warns about it. Wire it into one node; if two nodes need the same spot, store it with Set Global Position and read it back with Get Global Position.
  • The height comes from the *terrain*, exactly as with Snap To Ground. A point that lands over water sits on the seabed, and one under a bridge or inside a building sits on the dirt below the floor. Nothing checks whether the spot is sensible — it can land in the sea, in a rock, or inside a wall.
  • Points bunch toward the middle. The distance out is rolled evenly between 0 and the radius, which puts more of them near the center than around the rim. For an even-looking scatter, use a slightly larger radius than the area you have in mind.
  • This is server-side work. It belongs in a chain the server is already running, not on the client half of a menu or keybind chain.

Remainder (Modulo)

purebothpure.modulo

The remainder after dividing A by B (whole numbers). 7 mod 2 = 1. B of zero safely gives 0.

Inputs
Aint
Bint
Outputs
Resultint

The remainder after dividing A by B, whole numbers only: 7 mod 2 is 1, 60 mod 60 is 0. It sounds academic but it powers two everyday patterns — "every Nth" and "wrap around".

When to use it

Every Nth: a counter mod N is 0 exactly once every N steps — wire that through Equals (Numbers) into a Branch to act on every 5th kill or every 10th tick. Wrap around: an index mod the list count (Config List Count) walks a list forever without running off the end. And clock maths, as below.

Example

A round clock built from one number. Seconds remaining → To Whole NumberRemainder (Modulo) (B = 60) gives the seconds digits, while the same seconds remaining → Divide (B = 60) → To Whole Number gives the minutes. A Less Than (B = 10) on the seconds then decides whether they get a leading zero, and Join Text puts the two halves together.

Watch out

  • Both pins are whole numbers. A decimal source (a config value, a Divide result) must go through To Whole Number first — the editor will not wire a decimal in directly.
  • B of 0 safely gives 0 instead of erroring, so a zero divisor hides as "always 0" rather than announcing itself.

Round Number

purebothpure.roundNumber

Rounds a number to a whole number (stays a decimal value — use To Whole Number to change the type to a whole number).

Inputs
Valuefloat
Outputs
Resultfloat
Settings
Modeselect · Nearest | Down (Floor) | Up (Ceil) · default "Nearest"required

Rounds a decimal to a whole value, three ways: "Nearest" goes to whichever side is closer, "Down (Floor)" always goes down, "Up (Ceil)" always goes up.

The catch is in the word *value*. This node changes the number but not its type — 3.7 comes out as 4, still stored as a decimal — so a pin that insists on a whole number will still refuse the wire. To Whole Number is the node that changes the type. Round decides what happens to the fraction; To Whole Number carries the answer across.

When to use it

Anything a player reads. "Nearest" for a displayed figure, "Down (Floor)" for "how many complete X fit" (three and a half magazines is three magazines), "Up (Ceil)" for "at least one" (any part of a minute left still reads as a minute).

Example

Minutes remaining on a HUD countdown: seconds left → Divide (B = 60) → Round Number (Mode = "Up (Ceil)") → Join Text (" min left") → Set Text. Ceil rather than Nearest so that 61 seconds reads "2 min left" and only drops to "1 min left" once a full minute has actually gone — with Nearest it would jump to 1 while 61 seconds were still on the clock.

Watch out

  • Still a decimal afterwards. A Repeat count, a list index for Get Config Text At or a quick bar slot all need To Whole Number after this node, not instead of it.
  • "Down (Floor)" on a negative number goes further from zero: -3.2 floors to -4. To Whole Number would cut the same number to -3. If negatives are possible, pick deliberately.

Scale Vector

purebothpure.scaleVector

Multiplies a vector by a number (e.g. to make a direction a certain length).

Inputs
Vectorvector
Factorfloat
Outputs
Resultvector

Multiplies a vector by a number. Its main job is giving a direction a length: a unit direction from Direction A To B times 10 is "ten metres that way".

When to use it

Building "N metres toward / in front of" positions, or growing and shrinking an offset. Factor 0.5 halves a vector; a negative factor points it the opposite way. For scaling a plain number use Multiply.

Example

A point ten metres from a player toward a target: Direction A To B (player position → target position) → Scale Vector (Factor = 10) → Split Position → wire X, Y and Z into Offset Position on the player's position. The result is where a warning shot, marker or spawned item should land.

Snap To Ground

pureserverpure.snapToGround

Moves a position down onto the ground surface — stops things spawning underground or floating.

Inputs
Positionvector
Outputs
Groundedvector

Replaces a position's height with the terrain surface height at that spot. It asks the engine what the ground level is at the X/Z you gave it and puts Y exactly there — the cure for items spawning under a hill or hovering above a field.

When to use it

Right before anything that places something in the world from a made-up or configured position: Teleport Player, Spawn Item, Spawn Infected or Animal, Spawn Static Object. Config positions are typically written with the height left at 0 precisely because this node fixes it. Note Random Point Near already grounds its result — snapping again is harmless but not needed.

Example

Sending a player to a spot you typed by hand: Make Position (X 7500, Y 0, Z 5200) → Snap To GroundTeleport Player. The same chain works for spawn points you keep in the Config panel — Get Config PositionSnap To GroundTeleport Player — which is why those positions are written as "x 0 z" and left that way: the height is this node's job, and one config entry then works on any terrain.

Watch out

Ground means *terrain*. On a bridge, a rooftop or an upper floor, the snapped position lands on the dirt underneath the structure, not on the floor you can see. Positions meant to sit on or in buildings should carry their real height instead of being snapped.

Split Position

purebothpure.splitVector

Breaks a position into its X, Y (height) and Z numbers.

Inputs
Positionvector
Outputs
Xfloat
Y (height)float
Zfloat

Breaks a position into its three numbers: X (east), Y (height) and Z (north). Wire only the pins you need — the rest cost nothing.

When to use it

Reading a single axis — usually the height — or rebuilding a position with one axis changed via Make Position. It is also the bridge from vector maths to Offset Position, whose offset pins take numbers: split a scaled direction and feed its X/Y/Z in as the offsets.

Example

An altitude gate: Get Player PositionSplit Position → Y → Greater Than (B = 400) → BranchSend Notification ("The air is thin up here") — fires for players climbing the higher peaks.

Square Root

purebothpure.squareRoot

The square root of a number.

Inputs
Valuefloat
Outputs
Resultfloat

The square root: the number which, multiplied by itself, gives what you fed in. 9 gives 3, 100 gives 10, 2 gives about 1.41. It calls the engine's own Sqrt.

When to use it

Rarely for geometry — Distance Between already hands you metres between two positions, so you almost never have to do Pythagoras by hand. Where it earns its place is curve-shaping: a square root flattens a number that would otherwise run away, so a reward tied to a streak keeps growing but grows more slowly the higher it climbs. Power is the opposite tool, for curves that get steeper.

Example

A kill-streak bonus that tapers instead of exploding. Streak → Square RootMultiply (B = 50) → Round Number (Mode = Nearest) → To Whole Number → the reward amount. A 4-streak pays 100, a 9-streak 150, a 16-streak 200 — four times the kills for twice the money.

Watch out

  • There is no real square root of a negative number. If the input can go below zero — a subtraction result, a config value someone typed wrong — put Absolute Value or Clamp Number (Min 0) in front of it.
  • The Result is a decimal; whole-number pins need To Whole Number after it.

Subtract

purebothpure.subtract

Subtract two numbers.

Inputs
Afloat
Bfloat
Outputs
Resultfloat

A minus B. Order matters: wire the number you are subtracting *from* into A.

When to use it

Countdowns, differences, "how many left". A ticking countdown is Get Global NumberSubtract (B = 1) → Set Global Number under an Every N Seconds. For the gap between two numbers regardless of which is bigger, follow it with Absolute Value.

Example

Punishing a player who strays out of bounds. Every N Seconds (1) → Branch on your out-of-bounds test → Add To Global Number (strikes, 1) → Get Config Number (grace_seconds, 5) → Subtract (B = 0.5) → Greater Than (A = the strike count, B = that shaved grace) → Branch → the punishment. The half-step comes off the threshold, not the counter: it keeps a whole-number strike count from landing exactly on the boundary, where "greater than" is false and the check quietly never fires.

To Whole Number

purebothpure.truncate

Converts a decimal number to a whole number by dropping the fractional part (3.9 becomes 3). Rounds toward zero (-3.9 becomes -3). Use Round Number first if you want nearest/up/down.

Inputs
Valuefloat
Outputs
Wholeint

Cuts the fractional part off a number and gives back a whole one. 3.9 becomes 3, 0.4 becomes 0. It is not rounding: it always chops toward zero, so -3.9 becomes -3, not -4.

It exists because NodeZ keeps decimals and whole numbers apart on purpose. Pins that count things — a Repeat count, a list index for Get Config Text At, a quick bar slot, a magazine's round count — accept only a whole number, and the editor will not let a decimal wire reach one until this node sits in between. That refusal is the feature. It forces you to say out loud what should happen to the fraction instead of letting the engine quietly decide.

When to use it

Any time a computed number has to reach a counting pin: the output of Divide, a number read out of the Config panel, an average, or a per-player value read back with Get Player Number (which always comes back as a decimal, even when you stored a whole number in it). When you want the value *rounded* rather than cut, put Round Number in front of this node — Round changes the value, To Whole Number changes the type, and the pair together do what most people mean by "round it off".

Example

Splitting a countdown into minutes and seconds: seconds remaining → Divide (B = 60) → To Whole Number turns 754 ÷ 60 = 12.56 into 12 minutes, and the leftover seconds come from Remainder (Modulo) on the same source.

The list-index case is the other half of its job. A roll from Random Number is already a whole number, but once you have stored that roll on a player and read it back with Get Player Number it is a decimal again — so it needs this node before it can feed Get Config Text At.

Watch out

  • It cuts, it does not round. 3.99 is 3. Insert Round Number first when nearest, up or down matters.
  • Negatives go toward zero: -3.9 is -3, where Round Number with "Down (Floor)" would give -4.
  • Changing the type does not make a value valid. A negative or oversized index survives this node intact — combine it with Clamp Number or Remainder (Modulo) when the pin has a real range.

Values/Player

Find Item On Player

pureserverpure.findItemOnPlayer

The first item of a given class the player is carrying, anywhere — worn, in a pocket, or in a bag. Empty when they have none, so Is Valid tells you whether they are carrying one at all. With several of the same class you always get the same one, so binding two quick bar slots to one class binds the same item twice.

Inputs
Playerplayer
Item Classstring
Outputs
Itemitem

Searches everything a player is carrying for a class name and hands back the first match as a live item — not a yes/no, the actual thing, ready to feed into an item node. The search walks the whole inventory tree: hands, worn clothing, the pockets inside that clothing, the backpack and everything inside it. That is wider than most people expect, and it is why this node answers "do they have a canteen anywhere on them" rather than "are they wearing one".

The match is on the whole class name. The generated search lowercases both sides before comparing, so a slip in capitals will not sink this particular node — but it compares complete names, not families: asking for "Magazine" finds nothing, because no item is literally of that class. Nothing found gives an empty Item, which is a normal answer, not an error.

When to use it

When you need the item itself: binding it to the quick bar, reading or changing its condition, deleting it, filling it. For a plain "do they have one", Has Item In Inventory reads better; for "how many", Count Items In Inventory. For what is *worn* in a named slot rather than merely carried, use Get Attachment In Slot; for what is in their hands right now, Get Item In Hands. To match a whole family — any magazine, any knife — use Find Item In Inventory, which counts subtypes.

Pins

Item Class — the exact class, typed into the panel or wired in as text. A wire wins over the panel, which is what lets one graph serve a config-driven list.

Item — a live item, or empty when they carry none. Check it with Is Valid before using it.

Example

A water pump that refills whatever bottle a player is carrying: On Hold Interaction on the pump (prompt "Refill", 3 seconds) → Find Item On Player (WaterBottle) → Is ValidBranch → true: Set Item Quantity on the found item, set to full → Send Notification "Bottle filled"; false: Send Notification "You have nothing to fill".

The same shape drives a checkpoint that confiscates contraband: Find Item On Player (M67Grenade) → Is ValidBranchDelete Entity on the found item.

Watch out

  • The result is empty whenever they carry none, and item nodes given an empty item quietly do nothing. Put Is Valid in front of anything that matters.
  • First match only. Several of the same class all resolve to the same one item, so building a quick bar from a list with two entries of one class binds the same item to both slots (Set Quick Bar Slot).
  • Whole class names, not families. "Mag_STANAG_30Rnd" finds that magazine; "Magazine" finds nothing. Use Find Item In Inventory when subtypes should count.
  • It searches everything carried, bags included. If the point is that the item is *worn* — a gas mask on the face, not in a pocket — Get Attachment In Slot is the check you want.
  • Case is forgiving here and nowhere else in NodeZ. Type classnames exactly as vanilla spells them (GasMask, Aug) so the same text still works in nodes that do compare case.
  • Right after handing gear out, the item exists on the server before the player's own machine has it. Leave a beat — a Delay of about 2 s — before looking it up again to feed Set Quick Bar Slot, and remember that only the player crosses a delay, so the lookup must be redone on the far side rather than carried across.

Get Bleeding Wounds

pureserverpure.getBleedingCount

How many separate bleeding wounds a player has open (0 if none).

Inputs
Playerplayer
Outputs
Woundsint

How many separate bleeding wounds a player has open right now — 0 when none. Each cut in DayZ is its own bleeding source that drains blood on its own, so three wounds bleed three times as fast; this node reads the server's count of them.

When to use it

When yes/no is not enough: scaling urgency ("bleeding badly" vs "a scratch"), charging per wound at a medic, or logging fight severity. For a simple gate, Is Player Bleeding is the lighter check. Stop All Bleeding closes every wound at once; Apply Bleeding opens a new one.

Example

Every N Seconds (15) → For Each PlayerGet Bleeding WoundsGreater Than 2 → BranchSend Notification "You are bleeding out — bandage now!".

Watch out

  • Counting only happens server-side; the node returns 0 rather than failing when the bleeding bookkeeping is not there. Treat 0 as "no wounds", not proof the player is healthy — check blood with Get Player Blood for the damage already done.

Get Heat Comfort

pureserverpure.getHeatComfort

A player's heat comfort (negative = freezing, 0 = comfortable, positive = too hot).

Inputs
Playerplayer
Outputs
Heat Comfortfloat

How comfortable a player's body temperature is, as one signed number: below zero they are getting cold, zero is comfortable, above zero they are overheating. It is not degrees and not a percentage — it is the comfort reading vanilla itself uses to decide when the cold and hot symptoms appear and when exposure starts costing health. Wet clothes, rain, night, altitude and standing by a fire all move it.

When to use it

Weather and survival mods: warming stations, exposure warnings before someone freezes to death, harsher winter rules, rewards for surviving a storm. Read the weather that is causing it with Get Weather Level, and the time of day with Is Night Time.

Example

A cold warning that only nags people who are actually suffering: Every N Seconds (30) → For Each PlayerIs Player AliveBranchGet Heat ComfortLess Than (B = 0) → Branch → true: Send Notification "You are freezing — find shelter and dry clothes".

Turn the same reading into a rescue rather than a warning by putting Give Item To Player (a Rag to burn, say) on the true side instead of the message.

Watch out

  • The scale is small and centred on zero, and it is not comparable to health, blood or stamina. Print a few live readings with Log Message — one standing in the rain, one next to a fire — before you pick thresholds, or your gate will either never fire or never stop.
  • The sign is the whole point. A "warm enough" test written as greater than 0 fails a perfectly comfortable player, who sits at exactly 0; compare against a small negative number instead.
  • Loops over players include corpses until they despawn — a body's reading is meaningless, so gate with Is Player Alive.

Get Item In Hands

pureserverpure.getItemInHands

The item a player is currently holding in their hands (empty if none).

Inputs
Playerplayer
Outputs
Itementity

What a player is holding right now — the thing occupying the hands slot, whether that is a rifle, a can of beans or a splint. It reads the same hands slot the vanilla inventory screen shows, so it changes the instant they swap. Empty hands give an empty result, which is the normal answer, not a failure.

The output is an Entity — NodeZ's broad "any world thing" wire. It plugs straight into entity and object nodes such as Get Entity Type and Is Item Of Type. Nodes that want a proper item (quantity, health, the quick bar) need As Item in between, which comes back empty if the held thing is not an item at all.

When to use it

Rules about what someone is carrying in the moment: melee-only arenas, "holster your gun in the trader zone", requiring a tool before an interaction fires. For the same information delivered as an event at the moment of the swap, use On Held Item Changed. To find something anywhere on them rather than in their hands, use Find Item On Player; for what is worn in a slot, Get Attachment In Slot.

Example

A melee-only arena that polices itself: Every N Seconds (5) → For Each Player Near (the arena centre, radius 80) → Is Player AliveBranchGet Item In HandsIs Item Of Type ("Rifle_Base") → Branch → true: Send Notification "No firearms in the arena". Is Item Of Type counts subtypes, so one check covers every rifle in the game rather than a list of class names.

Watch out

  • Empty is a legitimate answer. Guard with Is Valid before doing anything with the result, or check it deliberately when "hands free" is the condition you care about.
  • It is an Entity, not an Item. Run As Item before item-only nodes, and check that result with Is Valid too.
  • Loops over players include corpses until they despawn, and a body still "holds" whatever it died with. Gate sweeps with Is Player Alive.

Get Player Blood

pureserverpure.getPlayerBlood

A player's current blood (5000 = full; below 2500 they are dead). The usable band is 2500 to 5000, not 0 to 5000 — PlayerConstants.BLOOD_THRESHOLD_FATAL is 2500, so a living player never reads lower than that. Half blood is 3750, and a threshold copied from a percent scale will never fire.

Inputs
Playerplayer
Outputs
Bloodfloat

A player's blood level, where 5000 is full. The floor is not zero: PlayerConstants.BLOOD_THRESHOLD_FATAL is 2500, and a player below that is dead — so every living player reads somewhere between 2500 and 5000. Blood is its own pool, separate from health; wounds drain it, food and rest regenerate it, and hitting the floor is what actually kills a bleeding player.

When to use it

Medic gameplay: warning the badly wounded, gating a "needs a transfusion" interaction, pricing a heal. Pairs with Set Player Blood to change it, and with Is Player Bleeding / Get Bleeding Wounds to see whether it is still draining. Overall condition is Get Player Health — a player can show decent health with dangerously low blood.

Example

Every N Seconds (30) → For Each PlayerGet Player BloodLess Than 3000 → BranchSend Notification "You need blood — find a medic". 3000 is a real warning: it leaves 500 above the fatal 2500. Testing below 2500 would never fire, because anyone there is already dead.

Watch out

  • The living range is 2500–5000, not 0–5000, and it is absolute while health is a percent (0–100). Half blood is 3750, not 2500. A threshold copied from a percent scale — "below 50" — can never fire at all, since the player died long before it.

Get Player By Name

pureserverpure.getPlayerByName

Finds an online player by their exact name (empty if not online).

Inputs
Namestring
Outputs
Playerplayer

Turns a typed name into a live player. The generated lookup walks the list of everyone connected and compares the name each one's profile reports, handing back the first that matches — or nothing when no one online is called that.

The comparison is exact: same letters, same capitals, no partial matches, and a stray space at the end is a miss. Names are also neither unique nor permanent — two people can join under the same name, and one person can change theirs between sessions. So treat this as a convenience for places where a human types a name, not as a way to remember who somebody is.

When to use it

Whenever a name arrives as text: a menu text box, a config entry, an admin tool. When the identity has to survive time — stored scores, whitelists, a reward paid out later — go through Steam IDs instead: Get Player Steam ID to record one and Get Player By Steam ID to turn it back into a player. Going the other way, player to name, is Get Player Name.

Example

A summon button in a menu: On Button ClickedClose MenuTeleport Player, with its Player pin fed by Get Player By NameGet Text Box Text (the name field) and its position fed by Get Player Position of the clicking player.

Two things make that work. Close Menu comes first because anything touching the player's own screen has to happen before the server work — the button splits into a client half and a server half at the first server action. And the name is read on the player's machine and sent across, while the lookup itself runs on the server, where the full player list actually exists.

Watch out

  • Exact, case-sensitive, whole-string matching. "dave" will not find "Dave", and nothing is trimmed for you — run the text through Change Text Case on both sides if you want to be forgiving, or ask for a Steam ID instead.
  • Online only. Someone who has just disconnected is gone, and so is the name on a corpse whose owner has left, because the name lives on the network identity.
  • Duplicate names give you whichever the server happens to list first, with no way to tell which one you got.
  • An empty name box is not short-circuited the way the Steam ID lookup is — it simply matches nobody. Check the box has been filled before acting on the result, and guard the Player output with Is Valid.

Get Player By Steam ID

pureserverpure.getPlayerBySteamId

Finds an online player by their Steam ID (empty if not online).

Inputs
Steam IDstring
Outputs
Playerplayer

The reverse of Get Player Steam ID: hand it a 17-digit Steam ID and it finds that person among everyone currently online, or comes back empty. The generated lookup walks the server's player list and compares each identity's plain ID. An empty ID short-circuits to "nobody" rather than matching the first player without an identity, so a missing config value fails closed instead of picking someone at random.

The mental model is that IDs are the durable half of a player. A player wire cannot be stored anywhere — it is only good for the event that produced it — but the ID is plain text you can keep. Store the ID, and turn it back into a live player at the moment you actually need to act on them.

When to use it

Paying something out that was decided earlier: last-attacker credit, a queued reward, an admin who should be told about events. Also any time the data outlives the event that produced it. For a name a human typed, use Get Player By Name. When all you need is "is this player one of my admins" and you never need the player object, Is Player In ID List does it in a single node.

Example

Live death reports to whoever is on duty, with the recipient kept in your project config so it can change without rebuilding the mod: On Player DiedGet Config Text (field admin_id) → Get Player By Steam IDIs ValidBranch → true: Get Player Name (Victim) → Join Text ("… was killed") → Send Notification on the found player.

The Is Valid gate carries real weight here: when the admin is offline, the lookup is empty and the branch simply skips the message.

Watch out

  • Online only. Anyone offline, and any corpse whose owner has left, comes back empty — always check with Is Valid.
  • The ID must be the bare 17-digit steam64 number as text, exactly as Get Player Steam ID reports it. Profile URLs and vanity names will not match.
  • Keep IDs in text pins and compare them with Text Equals. The number is too large for a numeric pin, which would silently lose digits.
  • An ID parked with Set Player Text dies with that player's session. If it has to survive a restart, keep it in your project config instead — the saved-value nodes (Set Saved Number) hold numbers, not text.

Get Player Direction

pureserverpure.getPlayerDirection

Which compass direction a player is facing, in degrees (0 = north, 90 = east).

Inputs
Playerplayer
Outputs
Facing (degrees)float

Which way a player is facing, as a compass heading in degrees: 0 north, 90 east, 180 south, 270 west. It is the yaw taken straight off the character's orientation, so it follows the body rather than the camera — free-look does not move it.

When to use it

Anything that cares about facing: remembering how someone stood before you moved them, aiming a spawned object the same way they are pointing, logging which road people leave town by. To turn a player rather than read them, use Set Player Direction; objects, vehicles and creatures have Get Entity Direction and Set Entity Direction. For the heading from one point toward another — which is a different question — use Direction A To B.

Example

An arena that puts people back exactly as they left. On the way in: On Press Interaction on the gate (prompt "Enter the arena") → Get Player DirectionSet Player Number (key return_facing) → Teleport Player to the arena. On the way out: Teleport Player home → Get Player Number (return_facing) → Set Player Direction.

Stamping the heading on the player is what makes the second half possible. A player-stored number survives the gap between the two events, where a plain wire would not.

Watch out

  • What you get is the raw engine yaw, with no tidying up. Do not assume every reading lands between 0 and 360; if you compare it against a range, log a handful of real values first (Log Message) and normalise negatives before testing.
  • Body facing only. A player looking over their shoulder with free-look still reads as facing forward.
  • Only the player crosses a Delay. A heading read before a wait is gone afterwards — stamp it with Set Player Number and read it back with Get Player Number rather than storing it in a global, which another player's event can overwrite while you wait.

Get Player Energy

pureserverpure.getPlayerEnergy

A player's current energy/food level (0 = starving, ~20000 = full).

Inputs
Playerplayer
Outputs
Energyfloat

A player's food energy as the engine stores it: an absolute value from 0 (starving) up to about 20000 (stuffed). It is the number behind the vanilla hunger icon — calories, effectively.

When to use it

Hunger warnings, survival events, deciding whether Give Energy should top someone up. Hydration is the sibling stat — Get Player Water — on a much smaller scale.

Example

Every N Seconds (60) → For Each PlayerGet Player EnergyLess Than 1000 → BranchSend Notification "You are starving". Gate with Is Player Alive so corpses are skipped.

Watch out

  • The scale runs to ~20000, four times water's ~5000. Copy-pasting a water threshold here makes the check fire far too early or never.

Get Player Health

pureserverpure.getPlayerHealth

A player's current health as a percentage (0 = dead, 100 = full).

Inputs
Playerplayer
Outputs
Health %float

A player's overall health as a percentage: 0 is dead, 100 is untouched. This is the character's main health pool — the one that hits and healing move — read the same way the vanilla HUD computes its health bar.

When to use it

Low-health warnings, "wounded" checks, scaling rewards or punishment by how hurt someone is. It pairs with Set Player Health (which also speaks percent) and Heal Player Fully. Blood and shock are separate pools with their own scales — read those with Get Player Blood and Get Player Shock; a player can have full health and nearly no blood.

Example

As a cheap corpse filter inside a periodic sweep:

Every N Seconds (5) → For Each PlayerGet Player HealthGreater Than (B = 0.5), And-ed with whatever you are enforcing — an out-of-bounds Distance Between check, say → BranchSend Notification "Return to the arena".

Bodies that are already dead read 0 health and stay in the player list for a while, so without that gate the sweep punishes them again on every tick. Is Player Alive reads better for the same job; this is the version spelled out in numbers, useful when you also want a "badly wounded" band from the same value.

Watch out

  • The scale is percent (0–100), unlike water, energy and blood, which are absolute values with much bigger ranges. Mixing them up makes thresholds silently wrong.

Get Player Name

pureserverpure.getPlayerName

The player's in-game name.

Inputs
Playerplayer
Outputs
Namestring

Turns a player wire into the name they joined the server with — the same name the vanilla death screen and your server logs show. The generated code reads it from the player's network identity, so it is the name their game profile reports, not anything your mod invents.

When to use it

Any time text needs to say who: killfeeds, welcome messages, scoreboards, log lines. It is display text only — for a key that identifies the same person next week, use Get Player Steam ID instead, because players can rename themselves between sessions. To go the other way (from a typed name back to a player), use Get Player By Name.

Example

Tell a killer who they just dropped: On Player DiedGet Player Name (Victim) → Join Text ("You killed " + name) → Send Notification on the Killer, title "Kill Reward". Gate it first — Killer → Is ValidBranch — because a death by zombie, fall or starvation hands you no killer at all. That is the wiring the Kill reward template drops on the canvas if you want it ready-made.

Read the name twice off the same event and you have a killfeed instead: once from Killer, once from Victim, Join Text into "Kazuto killed Dave", then Broadcast Notification so the whole server sees the same line. The same getter inside For Each Player (Ranked) turns a loop over scores into a readable scoreboard.

Watch out

  • The name lives on the player's identity, which the engine drops when they disconnect. A corpse whose owner has left reports empty text — read the name while the event that handed you the player is still running, or stamp it into a per-player text with Set Player Text early.
  • Never store per-player data keyed by name. Names change; the Steam ID does not.

Get Player Ping

pureserverpure.getPlayerPing

A player's current ping in milliseconds (-1 if unknown).

Inputs
Playerplayer
Outputs
Pingint

How long a round trip to a player's machine takes, in milliseconds, as the server measures it — the same latency figure server tools report. It is read from the player's network identity, and when there is no identity to ask (a corpse whose owner has left, mostly) it gives -1 rather than a number.

When to use it

Latency rules and diagnostics: refusing entry to a timed event, logging who was lagging when something went wrong, an admin readout. It pairs naturally with Kick Player, though see the caution below before wiring the two together directly.

Example

An hourly lag log: Every N Seconds (3600) → For Each PlayerGet Player PingGreater Than (B = 300) → Branch → true: Get Player NameJoin Text (" is at high ping") → Log Message.

Watch out

  • -1 means "unknown", not "perfect". A Less Than test against 100 counts -1 as passing; phrase the test with Greater Than so unknown readings fail it instead of sneaking through.
  • Ping moves constantly. One sample is a snapshot, not a verdict — count repeated bad readings with Add To Player Number before doing anything as final as a kick.
  • Loops over players include dead bodies until they despawn; gate with Is Player Alive if corpses should not appear in your log.

Get Player Position

pureserverpure.getPlayerPosition

Where the player is on the map.

Inputs
Playerplayer
Outputs
Positionvector

Where the player is standing right now, as a map position (a vector: east/west, height, north/south). It is the same position the engine uses for teleports and distance checks, so it drops straight into Distance Between, Teleport Player, Spawn Item and friends.

When to use it

Anything spatial that starts from a player: measuring how far they are from a point, spawning something at their feet, hand-rolled zone checks. For the position of an item, creature or vehicle, use Get Entity Position — this node only accepts a player wire.

Example

Keep everyone inside an arena: Every N Seconds (5) → For Each PlayerGet Player PositionDistance Between (that position and the arena centre, "7500 0 7500") → Greater Than (400) → Branch, and the True path punishes — Send Notification ("Return to the arena") then Damage Entity (15) on the same player. The read has to happen inside the loop, on every tick, because the whole point is to follow players as they wander.

The other everyday use is placing something relative to a body: On Player DiedGet Player Position (Victim) → Offset Position (0, 1.5, 0) → Spawn Item ("M67Grenade") floats the drop above the corpse instead of sinking it into the ground at the player's feet.

Watch out

  • The read happens at the moment of use. A getter wired after a Delay reports where the player is *after* the wait — which is usually what you want, because a position captured before the delay cannot cross it anyway. Only the player survives a delay; re-derive the position from them on the other side.

Get Player Shock

pureserverpure.getPlayerShock

A player's current shock. It drains when they take hits and they pass out at 0. The counterpart to Add Shock — full is healthy, 0 is unconscious.

Inputs
Playerplayer
Outputs
Shockfloat

A player's shock pool — the hidden stat that decides consciousness. Full is healthy; hits, melee and some drugs drain it; at 0 the player collapses unconscious. It recovers on its own over time, which is why knocked-out players eventually wake up.

When to use it

Reading how close someone is to going down, or how deep in unconsciousness they are. It is the counterpart to Add Shock (which lowers or raises the pool) and the mechanism behind Knock Out Player. For the resulting yes/no state, Is Player Unconscious is the direct check.

Example

On Player Took DamageGet Player Shock (Victim) → Less Than 500 → BranchSend Notification "You are about to pass out". On Player Knocked Out then fires when the pool actually empties.

Watch out

  • Low shock does not mean low health — the pools are independent. A melee brawl can zero shock while health stays high; read Get Player Health separately.

Get Player Stamina

pureserverpure.getPlayerStamina

A player's current stamina (0 = exhausted, 100 = full).

Inputs
Playerplayer
Outputs
Staminafloat

The stamina bar as a number: 0 when a player is completely blown, 100 when they are rested. It reads the same stamina handler the vanilla bar draws from, so it moves as they sprint, climb and haul weight, and it recovers on its own when they stop.

When to use it

Anything that should cost or require breath: gating a hard interaction on being rested, exhaustion penalties, rewarding players who arrive fresh. The write side is Set Player Stamina, which speaks the same 0-100 scale. For "are they sprinting at this instant", Is Player Sprinting answers directly instead of making you infer it from a falling number.

Example

A climb that only a rested player can make: On Hold Interaction on a climbing rope (prompt "Climb", 3 seconds) → Get Player StaminaLess Than (B = 20) → Branch → true: Send Notification "You are too winded to climb"; false: Teleport Player to the ledge above, then Set Player Stamina (10) so the climb actually costs something.

Watch out

  • This is an absolute reading, not a percentage of some per-player maximum — 50 is half of the vanilla scale. If your server tunes stamina through its gameplay config, log a real value once (Log Message) before choosing thresholds.
  • Stamina and energy are different things: this is the sprint bar, Get Player Energy is food. Mixing them up makes a threshold silently meaningless.
  • Loops over players include corpses; gate sweeps with Is Player Alive.

Get Player Steam ID

pureserverpure.getPlayerSteamId

The player's Steam ID (a unique text id).

Inputs
Playerplayer
Outputs
Steam IDstring

A player's Steam ID as text — the 17-digit "steam64" number you see in server logs, whitelists and ban tools. It is the one identifier that never changes: names are cosmetic, the ID is the account itself. The generated code reads it from the player's network identity and returns empty text when that identity is missing.

When to use it

Whenever you need to remember *who* across time or across events: keys for stored data, admin and VIP checks, kill credit. Is Player In ID List does the common "is this one of my admins" check in one node, and Get Player By Steam ID turns a remembered ID back into the live player.

Example

Credit a kill to whoever landed the last hit, even when the victim bleeds out a minute later. Track the hit: On Player Took DamageGet Player Steam ID on Attacker and again on Victim → Text EqualsNotBranch, which throws away self-inflicted damage, and the True path runs Set Player Text on the victim with key "last_attacker" and the attacker's ID as the value.

Then pay it out on death: On Player DiedGet Player Text ("last_attacker") on the victim → Get Player By Steam IDGive Item To Player ("Rag") → Send Notification. Storing the ID rather than the player is what makes the second half work — it survives the gap between the hit and the death, and it still resolves if the killer renamed themselves in between.

Watch out

  • Empty once the player's identity is gone — a body whose owner disconnected reports "". Grab the ID while they are online.
  • It is text, not a number. Compare IDs with Text Equals, never Equals (Numbers) — the number is too big for a numeric pin and would lose digits.

Get Player Vehicle

pureserverpure.getPlayerVehicle

The vehicle a player is sitting in. Empty when they are on foot — check with Is Valid.

Inputs
Playerplayer
Outputs
Vehicleentity

The vehicle a player is currently sitting in, handed to you as an entity you can act on. The generated lookup asks the engine whether the character is running its in-vehicle movement command and, if so, returns the transport that command is driving. No vehicle means no error — just an empty result.

Any seat counts. The driver and every passenger all report the same vehicle, because they are all riding the same transport.

When to use it

Turning "this player" into "their car" so the vehicle nodes have something to work on — Refuel Vehicle, Vehicle Engine, Unflip Vehicle, Repair Entity, Get Vehicle Fuel, Get Vehicle Speed, Is Engine Running. When all you need is a yes/no, Is Player In Vehicle reads better. Under the vehicle events — On Player Entered Vehicle and On Vehicle Engine Started — you do not need this node at all, because those hand you the vehicle directly.

Example

A garage that services anything driven into it: Every N Seconds (10) → For Each Player Near (the garage position, radius 15) → Get Player VehicleIs ValidBranch → true: Get Vehicle FuelLess Than (B = 0.5) → Branch → true: Refuel Vehicle (Amount 20) → Repair EntitySend Notification "Serviced — tank topped up".

The Is Valid gate is what keeps players who walk into the garage on foot out of the whole branch.

Watch out

  • Empty whenever they are on foot, which is most of the time. Check with Is Valid before every use — vehicle nodes handed nothing simply do nothing, and the bug looks like "my garage never works".
  • The output is an Entity, which is exactly what the vehicle nodes take, so it plugs in directly. Item nodes do not apply to a car.
  • Every occupant reports the same vehicle, so a sweep over nearby players services one car once per person sitting in it. When a car must be treated exactly once, drive the graph from On Player Entered Vehicle instead, which fires once for the driver.
  • Do not carry the vehicle across a Delay — only the player survives a wait. Look it up again on the far side, by which time they may have got out.

Get Player Water

pureserverpure.getPlayerWater

A player's current water/hydration level (0 = parched, ~5000 = full).

Inputs
Playerplayer
Outputs
Waterfloat

A player's hydration as the engine stores it: an absolute value from 0 (parched) up to about 5000 (full), not a percentage. It is the number behind the vanilla thirst icon.

When to use it

Thirst warnings, survival scoring, deciding whether Give Water is needed. Energy (food) is the sibling stat — Get Player Energy — on a different scale.

Example

Every N Seconds (60) → For Each PlayerGet Player WaterLess Than 500 → BranchSend Notification "Find water soon". Gate the loop with Is Player Alive so corpses are skipped.

Watch out

  • Absolute scale, roughly 0–5000 — a threshold like "below 50" is nearly dead, not "half".

Has Broken Legs

pureserverpure.hasBrokenLegs

True if a player's legs are broken (splinted still counts as broken).

Inputs
Playerplayer
Outputs
Brokenbool

True when a player's legs are broken — and, deliberately, still true once they have splinted them. The check compares the engine's leg state against "not broken", and both the plain broken state and the splinted state fail that test. A splint restores mobility; it does not mend the fracture, and this node reports the fracture.

When to use it

Medic mods and injury rules: charging for treatment, blocking a climb or a teleport while someone is crippled, punishing a bad fall. The write side is Set Broken Legs, which can heal, break or splint. For other injuries, Is Player Bleeding and Has Disease answer the same shape of question.

Example

A field hospital: On Hold Interaction on a medical tent (prompt "Field surgery", 6 seconds) → Has Broken LegsBranch → true: Set Broken Legs (Healed) → Send Notification "Your legs have been set"; false: Send Notification "Nothing to treat here".

Watch out

  • Splinted still reads as broken. This node cannot tell "crippled" from "walking on a splint" — if your rule needs that distinction, it cannot be built from this reading alone.
  • Loops over players include corpses until they despawn, and a body that fell to its death still reports broken legs. Gate sweeps with Is Player Alive.

Has Disease

pureserverpure.hasDisease

True when a player is carrying a disease. The counterpart to Give Disease / Cure All Diseases.

Inputs
Playerplayer
Outputs
Has Itbool
Settings
Diseaseselect · Cholera | Influenza | Salmonella | Brain Disease | Food Poisoning | Chemical Poisoning | Wound Infection | Nerve Agent | Heavy Metal Poisoning · default "Influenza"required

True when a player is carrying a particular illness. DayZ tracks sickness as "agents" in the bloodstream — cholera, influenza, a wound infection, nerve agent — and this node asks whether the count of the one you picked is above zero. It is the same list of agents Give Disease injects and Cure All Diseases clears, so the three nodes read as one family.

Above zero means present, not necessarily symptomatic. A small dose the body is quietly fighting off still reads true, well before the player sees any sign of it.

When to use it

Medic economies (charging to cure, and only when there is something to cure), warnings, gating a trader or a safe area on being clean, illness that spreads between players. Pick the illness in the node's Disease list; one node answers about one disease, so covering three means three nodes joined with Or.

Example

A doctor's tent that only charges when it treats something: On Hold Interaction on the tent (prompt "See the doctor", 4 seconds) → Has Disease (Cholera) → Branch → true: Cure All DiseasesSet Player Health (60) → Send Notification "Treated for cholera"; false: Send Notification "You are healthy — nothing to treat".

Wire a second Has Disease set to Food Poisoning into a Or with the first and the same tent covers both, still curing everything in one go.

Watch out

  • One node, one agent. There is no "are they sick with anything" reading, and Cure All Diseases clears the lot regardless of which one you tested for.
  • Any amount counts. A trace dose and a full-blown infection both read true, and nothing here tells you how bad it is.
  • A weak dose from Give Disease can be fought off before symptoms ever show, and it reads true for the whole time the body is beating it. Give 100 or more when a check downstream is meant to find a real illness.
  • Loops over players include corpses until they despawn; gate sweeps with Is Player Alive.

Is Player Alive

pureserverpure.isPlayerAlive

True while the player is alive, false once they are a corpse. A dead player is still a player until the body goes, so loops over everyone online include corpses. Gate on this whenever a corpse should not count — otherwise a body sitting on a pickup claims it.

Inputs
Playerplayer
Outputs
Is Alivebool

True while the player is alive, false the moment they become a corpse. This matters more than it sounds: in DayZ a dead body is still a player object until it despawns, so a "player" handed to you by a loop or an event can be minutes-dead.

When to use it

Gate any logic where a corpse must not count. For Each Player and For Each Player Near include dead bodies; Count Players Near and area checks see them too. Wire this in front whenever the action only makes sense for the living — pickups, rewards, damage, teleports. To tell "knocked out" apart from "dead", pair it with Is Player Unconscious: an unconscious player is still alive.

Example

The canonical version, a periodic sweep that lets players collect dropped grenades by standing on them: Every N Seconds (1) → For Each PlayerIs Player AliveBranch, and only living players go on to the For Each Object Near sweep (Radius 2) whose body filters with Get Entity TypeText Equals ("M67Grenade") before picking the grenade up. Without the gate, a body lying on a pickup would "collect" it every second.

Watch out

  • This is exactly the corpse trap: loops over everyone online include dead bodies until they despawn. Any per-player periodic logic (Every N Seconds sweeps especially) should start with this check unless corpses are genuinely wanted.
  • Inside On Player Died the victim is already dead — this node answers false for them, so do not use it there to mean "was this a real player".

Is Player Bleeding

pureserverpure.isPlayerBleeding

True while a player has at least one open bleeding wound.

Inputs
Playerplayer
Outputs
Bleedingbool

True while the player has at least one open bleeding wound — the same state the vanilla blood-drop indicator shows. It answers yes/no; Get Bleeding Wounds tells you how many cuts.

When to use it

Gating medic interactions, warning players, deciding whether Stop All Bleeding has work to do. The opposite direction — making someone bleed — is Apply Bleeding.

Example

On Hold Interaction on a medic tent (prompt "Get treated") → Is Player BleedingBranch → true: Stop All BleedingSend Notification "Patched up"; false: Send Notification "You are not bleeding".

Is Player Crouching

pureserverpure.isPlayerCrouching

True while a player is crouched (weapon raised or not).

Inputs
Playerplayer
Outputs
Crouchingbool

True while a player is in the crouched stance. Both crouch stances count — hands down or weapon raised — so aiming down sights from a kneel still reads true.

When to use it

Stance-driven rules: a gap only a crouching player fits through, a stealth bonus, an interaction that should require kneeling. The siblings are Is Player Prone for lying down and Is Player Sprinting for running flat out. There is no "standing" node — standing is simply neither of the first two, which Not and And can express.

Example

A gap in a wall that only fits someone crouched: On Press Interaction on the wall section (prompt "Squeeze through") → Is Player CrouchingBranch → true: Teleport Player to the far side; false: Send Notification "You will have to crouch to fit through".

Watch out

  • Stances change constantly. This is a reading of the instant it runs, so a slow periodic sweep will mostly miss people who crouch briefly — sample every second or two if you are hunting for a moment rather than gating an interaction.
  • Loops over players include corpses until they despawn; gate with Is Player Alive.

Is Player In ID List

pureserverpure.isPlayerInIdList

True if a player's Steam ID is in your list — handy for admin/VIP/whitelist checks. Put IDs separated by commas, e.g. 76561198000000001,76561198000000002

Inputs
Playerplayer
Outputs
In Listbool
Settings
Steam IDs (comma-separated)text

The one-node admin check. Type your Steam IDs into the node's panel, wire a player in, and it answers true when that player is one of them. The generated check splits your text on commas, trims stray spaces off each entry, and compares the result against the player's own identity ID — so 76561198000000001, 76561198000000002 works exactly as well as the same line without the space.

Because the list is a panel field, it is baked into the generated mod. Changing who is on it means editing the graph and rebuilding.

When to use it

Gating anything that only some accounts should get: admin tools, VIP kits, tester-only features, a whitelist for a private event. When you need the player object behind an ID rather than a yes/no, use Get Player By Steam ID; when you need the ID of a player you already have, Get Player Steam ID.

If the list has to change without a rebuild, keep the IDs in your project config instead and compare there: Get Config Text into Text Contains, searching for the player's own Get Player Steam ID. Every steam64 ID is the same length, so a "does the list contain this ID" test cannot half-match a different one.

Pins

Steam IDs (comma-separated) — the panel list. Bare 17-digit numbers, separated by commas; spaces around them are trimmed for you. A blank list matches nobody, so an unfinished node fails closed.

Example

A VIP spawn kit: On Player ReadyIs Player In ID List (your IDs) → Branch → true: Give Weapon (Aug with Mag_AUG_30Rnd) → Give Item To Player (BandageDressing) → Send Notification "VIP loadout issued". Everyone else falls out of the false side and spawns normally.

Watch out

  • A player with no network identity — a corpse whose owner has already left — is false, never true. Run the check while they are still connected.
  • Bare steam64 numbers only. Profile URLs, vanity names and in-game names will not match, and a wrong entry fails silently: the player simply never qualifies.
  • The list is compiled into the mod, not read from disk at runtime. Adding an admin means regenerating and redeploying.

Is Player In Vehicle

pureserverpure.isPlayerInVehicle

True while a player is sitting in any vehicle (driving or as a passenger).

Inputs
Playerplayer
Outputs
In Vehiclebool

True while a player is seated in anything drivable — driver or passenger, engine running or not, moving or parked. It asks the engine whether the character is currently running its in-vehicle movement command, which is what "in a vehicle" means to DayZ.

When to use it

Excluding drivers from rules meant for people on foot (zone sweeps, stamina drains, footstep effects), or requiring a vehicle before something fires. When you need the vehicle itself and not just the answer, use Get Player Vehicle and check it with Is Valid — that is the same test in one step, with the car attached.

Example

A safe zone that keeps traffic out: Every N Seconds (5) → For Each Player Near (the trader position, radius 100) → Is Player In VehicleBranch → true: Send Notification "No vehicles inside the trader zone" → Vehicle Engine (Stop) on Get Player Vehicle.

Watch out

  • True the moment they sit down, before anything is started. If you mean "driving", combine it with Is Engine Running on Get Player Vehicle, or with a Get Vehicle Speed threshold.
  • Passengers count too, so a per-player sweep sees a full car as several hits.
  • Loops over players include corpses until they despawn; gate with Is Player Alive where that matters.

Is Player Invulnerable

pureserverpure.isPlayerInvulnerable

True while a player cannot take damage. The counterpart to Set Player Invulnerable.

Inputs
Playerplayer
Outputs
Invulnerablebool

True while a player cannot be damaged — the god-mode flag Set Player Invulnerable switches on and off. The generated check reads the engine's "allow damage" switch and inverts it, so what you get is the character's real state, not a note your graph left for itself.

That distinction matters, because invulnerability does not persist. It is dropped on disconnect, on respawn and on a server restart. Reading the live flag is the only way to find out whether a safe-zone rule is still in force for someone who left and came back.

When to use it

Safe zones — re-applying protection to people who should have it and stripping it from people who should not — plus admin tooling and any place you want to avoid switching a flag that is already set. For the moments people cross a boundary, use Player Entered Zone and Player Left Zone.

Example

A safe zone that repairs itself: Every N Seconds (5) → For Each Player Near (the trader position, radius 60) → Is Player AliveBranchIs Player InvulnerableNotBranch → true: Set Player Invulnerable (on) → Send Notification "Safe zone: you are protected".

Because the sweep only acts when the flag is missing, a player who reconnects inside the zone quietly gets their protection back, and nobody else is told the same thing every five seconds. Pair it with Player Left ZoneSet Player Invulnerable (off), or players walk out of the zone immortal.

Watch out

  • Nothing persists it. A one-shot "protect on entry" wiring leaves anyone who relogs inside the zone unprotected, which is exactly why the periodic re-check above earns its keep.
  • The flag has no owner. If another graph — or another mod — turned it on, this reads true too, and switching it off takes their protection away as well.
  • Do not treat it as a general safety reading. It answers one question: can this character be damaged right now.
  • Loops over players include corpses until they despawn; gate with Is Player Alive.

Is Player Prone

pureserverpure.isPlayerProne

True while a player is lying prone (weapon raised or not).

Inputs
Playerplayer
Outputs
Pronebool

True while a player is lying prone. Both prone stances count — flat on the ground with hands down, or propped up aiming — so a sniper in position still reads true.

When to use it

Crawl-only passages, "take cover" checks, hiding bonuses that reward staying flat. The siblings are Is Player Crouching and Is Player Sprinting; combine them with Not when you need "standing up".

Example

A wire fence you can only get under on your belly: On Press Interaction on the fence (prompt "Crawl under the wire") → Is Player ProneBranch → true: Teleport Player to the other side; false: Send Notification "Go prone to fit under the wire".

Watch out

  • Being knocked out is a separate state, not a stance. Test it with Is Player Unconscious rather than assuming a downed player reads as prone.
  • Stance is an instant reading, so a slow sweep will miss brief moments. Sample every second or two when you are watching for one.
  • Loops over players include corpses until they despawn; gate with Is Player Alive.

Is Player Restrained

pureserverpure.isPlayerRestrained

True while a player is handcuffed/restrained.

Inputs
Playerplayer
Outputs
Restrainedbool

True while a player is tied up — handcuffs, rope or duct tape — the state where they cannot use their hands or their inventory. It is exactly the state Set Player Restrained sets and clears, read back from the character rather than from a note your mod kept.

When to use it

Jail, kidnapping and bounty mods: blocking teleports, traders and interactions for someone who is tied, or making sure a "cut them free" action only does something when there is somebody to free. Pair it with Is Player Unconscious and Is Player Alive when a rule needs all three states to line up — restrained, knocked out and dead are three different things.

Example

A teleport pad that will not launder prisoners: On Press Interaction on the pad (prompt "Use the pad") → Is Player RestrainedBranch → true: Send Notification "You cannot use this while restrained"; false: Teleport Player to the destination.

Watch out

  • Do not trust a reading taken before a Delay. Someone can be cut free during the wait, so re-read on the far side rather than carrying the answer across — only the player itself survives a delay.
  • Restrained says nothing about consciousness or health. A tied player can be perfectly healthy, and a knocked-out player is not restrained.
  • Loops over players include corpses until they despawn; gate with Is Player Alive.

Is Player Sprinting

pureserverpure.isPlayerSprinting

True while a player is sprinting.

Inputs
Playerplayer
Outputs
Sprintingbool

True while a player is actually sprinting — the fastest movement setting, not ordinary running. It is a reading of the exact instant it runs, and people sprint in short bursts, so how often you ask matters as much as what you ask.

When to use it

Rules about running: no sprinting inside a trader zone, noise or fatigue penalties, chases. For how much breath they have left rather than what they are doing with it, read Get Player Stamina. The stance siblings are Is Player Crouching and Is Player Prone.

Example

A trader zone that makes people walk: Every N Seconds (1) → For Each Player Near (the trader position, radius 40) → Is Player AliveBranchIs Player SprintingBranch → true: Set Player Stamina (0) → Send Notification "Slow down inside the trader zone". Draining the bar stops the sprint rather than merely complaining about it.

Watch out

  • Sample often. A check every thirty seconds will almost never catch anyone; one second is about the coarsest useful interval for spotting sprinting at all.
  • Emptying stamina stops the sprint, so a second reading straight after Set Player Stamina (0) comes back false. Do not treat that as the rule having failed.
  • Loops over players include corpses until they despawn; gate with Is Player Alive.

Is Player Unconscious

pureserverpure.isPlayerUnconscious

True while a player is knocked out.

Inputs
Playerplayer
Outputs
Unconsciousbool

True while a player is knocked out — the black screen, still alive, unable to do anything. In DayZ that state is driven by the shock pool: hits drain shock, at zero the character collapses, and it refills slowly until they come round on their own. This node reports the resulting state rather than the pool behind it.

An unconscious player is still a living player, so Is Player Alive answers true for them as well. The two checks are not alternatives; they answer different questions.

When to use it

Rules that must skip people who are down (rewards, teleports, arena scoring), rescue and revive mechanics, and "finish him" mechanics. The moments themselves arrive as On Player Knocked Out and On Player Woke Up; how close someone is to going down is Get Player Shock; the controls are Knock Out Player and Wake Up Player.

Example

A mercy timer that picks players up if nobody else does: On Player Knocked OutDelay (120 seconds, carrying the Player) → Is Player UnconsciousBranch → true: Wake Up PlayerSet Player Health (30) → Send Notification "You come round, dazed but alive".

The re-check after the wait is the whole point. Two minutes is long enough for the player to have woken naturally, been finished off, or logged out, and asking again is the only honest way to find out which.

Watch out

  • Unconscious is not dead. Do not use this as a death check — Is Player Alive is that check, and it stays true for someone who is merely knocked out.
  • Only the player crosses a Delay. Anything else you knew before the wait — who put them down, where they were — has to be stamped onto the player first with Set Player Text or Set Player Number and read back afterwards; a global written before the wait can be overwritten by another player's event while you wait.
  • Loops over players include corpses until they despawn, and a body that went down before it died is not worth guessing about. When you mean "down but alive", say so: Is Player Alive and this node together, joined with And.

Was Killed By Headshot

pureserverpure.wasHeadshot

True when the blow that killed this player hit the brain. The game works this out itself on the killing hit, so read it on the victim inside On Player Died. It is the same test the death screen uses, and it stays false for a death with no killing blow — bleeding out, or respawning from the menu.

Inputs
Playerplayer
Outputs
Was Headshotbool

True when the blow that killed this player hit the brain. The engine sets a flag on the character at the moment of the killing hit — it is the same test the vanilla death screen uses to show its headshot message — and this node simply reads that flag off the victim.

When to use it

Headshot bonuses, killfeed flair, sniper challenges. Read it on the Victim inside On Player Died — that is the one moment the flag is guaranteed fresh, set by the hit that just landed. It answers a question about *how they died*, so it has no meaning on a living player.

Example

A killfeed row that knows how the kill landed: On Player DiedWas Killed By Headshot (Victim) → the On / Off pin of Broadcast Client Message (message "kill"), with Get Player Name (Killer) into Text 1, Get Player Name (Victim) into Text 2, and Get Item In Hands (Killer) → Get Display Name into Text 3 for the weapon. Every client's On Client Message ("kill") builds the row from that payload and paints a headshot marker when the flag is true — the server decides, the client only draws.

Watch out

  • Headshots are Brain, not Head. The engine only sets the flag for the "Brain" damage zone; a grazing hit to the head model does not count. That is vanilla behaviour, not a NodeZ choice.
  • Deaths with no killing blow — bleeding out, falling, respawning from the menu — leave the flag false. Those deaths also have no killer; if credit matters, keep your own last-attacker record — On Player Took DamageSet Player Text on the Victim, holding the Attacker's Steam ID — and read it back on death. Check the killer with Is Valid either way.

Values/Server

Get Date & Time Text

pureserverpure.getTimestampText

The real-world server date and time as text (e.g. 2026-07-17 14:05:33). Great for log lines.

Outputs
Timestampstring

The real-world clock of the server machine, as one line of text: 2026-07-17 14:05:33. This is wall-clock time — it has nothing to do with the in-game sun.

When to use it

Stamping log lines and admin records so you can tell when something happened. For in-game time of day use Get In-Game Time or Is Night Time. For measuring how long something took, prefer Get Server Uptime — that is a number you can subtract.

Example

On Player ConnectedJoin Text (Get Date & Time Text + " joined: " + player name) → Write To Log File. Because the year comes first, log lines sort into time order by themselves.

Watch out

It is text, not a number — you cannot subtract two timestamps to get a duration. Store Get Server Uptime when you need elapsed-time math, and keep the timestamp for the humans reading the log.

Get Online Player Count

pureserverpure.getOnlinePlayerCount

How many players are currently connected to the server.

Outputs
Countint

A live headcount of the server: how many player characters exist right now. It reads the same engine list every "for each player" loop walks, so the number always matches what For Each Player would visit.

When to use it

Scaling things to population — only start an event with four or more players online, size a reward pool, or tell clients how long a scoreboard is about to be. For players near one spot, use Count Players Near instead; to actually do something to each player, use For Each Player.

Example

Pushing a scoreboard to every client: For Each Player (Ranked) broadcasts one message named "row" per player, and then — after the loop, on the same exec line — a closing Broadcast Client Message named "rows" carries Get Online Player Count in Number 1.

Every client now knows exactly how many rows it just received, so its HUD can size the board and know the list has ended, instead of guessing from the gap between messages.

Watch out

A corpse is still a player: dead bodies stay in the engine's player list until they despawn, so the count can include the recently dead. When only living players should count, loop with For Each Player, gate on Is Player Alive, and tally with Counter instead of trusting the raw number.

Get Server Name

pureserverpure.getServerName

The server's host name.

Outputs
Namestring

The name your server shows in the in-game server browser — the hostname line from your serverDZ.cfg, read live from the running server.

When to use it

Welcome messages, log headers, or any text that should carry the server's branding. Set the name once in serverDZ.cfg and every graph picks it up — rename the server and the mod follows without a rebuild.

Example

On Player ReadyJoin Text ("Welcome to " + Get Server Name) → Send Notification greets each player with the server's own name.

Values/Text

Change Text Case

purebothpure.changeTextCase

Converts text to all uppercase or all lowercase.

Inputs
Textstring
Outputs
Resultstring
Settings
Caseselect · UPPERCASE | lowercase · default "UPPERCASE"required

Converts a piece of text to all capitals or all lower case, whichever the Case property is set to. Letters change; numbers, spaces and punctuation are left as they are.

When to use it

Two jobs. Presentation — killfeed names and headings in capitals look deliberate rather than accidental, and the layout never has to be re-authored to change it. And case-insensitive comparison: lower-case both sides before a Text Equals or a Text Contains and a server owner can type "gasmask" or "GasMask" in the config and be understood either way.

Example

Killfeed names in capitals. Under On Client Message "kill": Change Text Case (Case UPPERCASE) on the message's Text 1 → Set Text on the card's CardKiller label. The same node on Text 3 for the victim.

Watch out

  • Never send a classname through it on the way to a node that spawns, gives or attaches something. Classnames are case-sensitive — "gasmask" and "AUG" match nothing, silently. Compare in lower case if you like, but keep the original spelling for the value you actually use.

Count Text Parts

purebothpure.textPartCount

How many pieces a separated text has: "Shirt,Pants,Boots" is 3. Feed it into Repeat to walk EVERY piece with Get Text Part. A fixed Repeat count silently drops everything past it — a list of 29 read 12 at a time loses 17 without a word.

Inputs
Textstring
Outputs
Countint
Settings
Separatortext · default ","

Counts the pieces in a separated text: "Shirt,Pants,Boots" is 3. It exists to size loops — wire it into Repeat so the loop runs exactly once per piece, however many the server owner typed.

When to use it

Always pair it with Get Text Part: this node sets how many times the loop runs, the loop's Index picks each piece. For counting entries of a real config list (not separated text), use Config List Count instead.

Pins

Separator (property) — must match the separator on the Get Text Part nodes reading the same text, or the count and the pieces disagree.

Example

Attaching however many parts a loadout line lists. One config entry holds "weapon=M4A1; attachments=ACOGOptic,M4_Suppressor,M4_RISHndgrd": Get Setting ("attachments") → Count Text PartsRepeat (Count), and the Repeat Index → Get Text Part (same text, same separator) → the Item Class pin of Attach Item To Item, attaching onto the Weapon that Give Weapon handed back. Every kit gets exactly as many attachments as its line lists — three here, one or none in the next entry — and the graph never changes when the owner edits the text.

Watch out

A hard-coded Repeat count silently drops everything past it — a list of 29 items read 12 at a time loses 17 without a word. Let this node drive the loop and the graph follows whatever the owner writes.

Get Setting

purebothpure.getSetting

Reads one named setting out of text written as "name=value; name=value". Lets a single config entry hold a whole set: "weapon=M4A1; ammo=Mag_STANAG_30Rnd" gives "M4A1" for weapon. Order does not matter, spacing is ignored, and a name that is not there gives empty text. Feed the value into Get Text Part when it holds a comma-separated list.

Inputs
Textstring
Settingstring
Outputs
Valuestring

Reads one named value out of text written as "name=value; name=value". Give it "weapon=M4A1; ammo=Mag_STANAG_30Rnd" and ask for "weapon" — you get "M4A1". Where Get Text Part unpacks by position, this node unpacks by name, so the pieces can appear in any order and optional ones can simply be left out.

It is the key that makes one config entry describe a whole thing: a loadout, an arena, a zone. The parser is deliberately forgiving — it is reading text a server owner typed into config.json, so spacing is ignored and the name match does not care about case.

When to use it

When a single config list entry needs several properties. A list entry is always one string (lists cannot nest), so you encode "name=Quarry; center=4600 0 10300; radius=120" and unpack each property here. Use Get Text Part for plain unnamed lists — and feed this node's Value into it when a setting's value is itself a comma list.

Pins

Setting — the name to look up, the part left of "=". Matched ignoring case and surrounding spaces.

Example

Give the config a text list called "arenas" with one entry per arena: "name=Quarry; center=4600 0 10300; radius=120". Then On Server StartedFor Each Config Text (arenas) → Get Setting ("center") → Text To PositionSnap To Ground gives you the live centre, and the same entry → Get Setting ("radius") → Text To Number gives the size. One line of config carries three properties, and there is no second list to keep in step with the first.

A loadout works the same way: "weapon=M4A1; ammo=Mag_STANAG_30Rnd; items=Rag,Morphine". Read "weapon" into Give Weapon, "ammo" into Give Item To Player, and "items" into Get Text Part, because that value is itself a comma list. Settings a particular entry does not need are simply left out.

Watch out

  • A name that is not in the text gives empty text, silently. Wire that into

Give Weapon and nothing appears with no error — treat empty as "not set".

  • The name match is forgiving, but the value comes back exactly as typed.

Classname values are still case-sensitive: "ammo=mag_stanag_30rnd" fails forever.

  • Settings are separated by ";". Commas are safe inside a value — that is

exactly how a nested list rides along.

Get Text Part

purebothpure.getTextPart

One piece of a separated text: part 0 of "Shirt,Pants,Boots" is "Shirt". Whitespace around each part is trimmed. Out-of-range gives empty text — pair with Text Equals "" to stop a loop.

Inputs
Textstring
Part (from 0)int
Outputs
Partstring
Settings
Separatortext · default ","

Pulls one piece out of text that holds several values with a separator between them: part 0 of "Shirt,Pants,Boots" is "Shirt", part 2 is "Boots". This is the unpacking half of the standard NodeZ list trick — a config list entry is always one string, so several values ride a single entry with commas, and this node takes them back apart.

When to use it

Whenever one text carries a list: a comma-separated set of classnames, a "+" chain of an item and its attachments. Wire Count Text Parts into Repeat and the loop's Index into this node to walk every piece. When the pieces have names instead of positions ("weapon=M4A1; ammo=..."), reach for Get Setting instead — order stops mattering.

Pins

Part (from 0) — which piece you want; the first is 0, not 1. Separator (property) — the character between pieces. Comma by default; "+" is the usual second choice, for a nested chain that rides inside one comma piece. An empty separator falls back to comma.

Example

Hand out a kit from one config line. A loadout's "items" setting reads "Mag_STANAG_30Rnd,Mag_STANAG_30Rnd,Morphine", so wire it into Count Text PartsRepeat, and the loop's Index feeds Get Text PartGive Item To Player. The owner adds or removes items by editing the line; the graph never changes.

Each piece can itself be a "+" chain — "M4A1+M4_Suppressor". Feed that piece into a second Get Text Part with separator "+": part 0 is the item to spawn, and the parts after it go to Attach Item To Item. Two of these nodes with different separators is how one entry describes a weapon and its attachments.

Watch out

  • An out-of-range part gives empty text with no error. Get the real count from

Count Text Parts instead of hard-coding it.

  • Whitespace around a piece is trimmed, so "a, b" works — but the piece itself

keeps its exact case, and classnames are case-sensitive ("GasMask", not "Gasmask").

  • Config lists cannot nest; separated text unpacked here is the supported way

to put structure inside one entry.

Join Text

purebothpure.joinText

Joins two pieces of text together into one. Chain them to build a longer line: feed one Join Text into the First pin of the next. Numbers wired in convert themselves, though whole ones read better — send them through To Whole Number first, or a health value prints as 24.099998.

Inputs
Firststring
Secondstring
Outputs
Textstring

Sticks two pieces of text together, in order, with nothing between them. It is the node that turns loose values into a sentence: a name plus " was killed by " plus another name, a score plus " kills".

Nothing is inserted for you, so any space or punctuation has to be part of one of the two pieces — "Round " and "3" gives "Round 3", while "Round" and "3" gives "Round3". Numbers can be wired straight into either pin and convert to text by themselves.

When to use it

Building any string a player will read: chat lines through Send Chat Message, notification bodies, HUD labels through Set Text, log lines through Write To Log File. It is also the packing half of the separated-list trick: a config list entry is one string, so join the parts with a comma and take them apart later with Get Text Part.

Pins

First / Second — either can be a typed literal or a wire. Only two slots, so a three-part line means two of these nodes chained: join the first two, then join that result with the third.

Example

A death message with distance. On On Player Died: Join Text (First = Get Player Name of the Killer, Second = " killed ") → a second Join Text (First = that result, Second = Get Player Name of the Victim) → Broadcast Chat Message. Reading the chain left to right reads exactly like the finished line.

Watch out

  • A decimal wired onto a text pin prints its decimal places. Send scores, ranks and distances through To Whole Number or Round Number first, so a line says "42 kills" and not "42.000000 kills".
  • When you are packing values to be unpacked later, make sure the separator cannot appear inside the pieces themselves — a comma-joined pair falls apart if one of the pieces already contains a comma.
  • Joining is not formatting: it will happily build a classname out of fragments, and classnames are case-sensitive, so "gas" + "Mask" is not "GasMask".

Replace Text

purebothpure.replaceText

Replaces every occurrence of one piece of text with another.

Inputs
Textstring
Findstring
Replace Withstring
Outputs
Resultstring

Swaps one piece of text for another, everywhere it appears. "Welcome {name}!" with Find "{name}" and Replace With the player's name becomes "Welcome Bob!". Replacing with empty text deletes instead: it is the way to strip a prefix, a tag or a stray character out of a string.

The original is untouched — like every value node, this hands you a new piece of text and leaves its input alone.

When to use it

Filling placeholders in messages your server owners wrote in the Config panel, so the wording lives in the config and only the values come from the graph. For assembling a line out of parts you already hold, Join Text is more direct; for pulling one value out of a packed string, use Get Text Part or Get Setting.

Example

A configurable welcome line. Add a config text field welcome_message holding "Welcome to {server}, {name}!". On On Player Ready: Get Config Text ("welcome_message") → Replace Text (Find "{server}", Replace With Get Server Name) → a second Replace Text (Find "{name}", Replace With Get Player Name) → Send Notification with the event's Player wired in.

The owner rewrites the greeting in the config file without ever opening the editor, and the placeholders keep working.

Watch out

  • Find is case-sensitive, exactly like a classname: "{Name}" does not match "{name}", and a mismatch shows up as a message with the placeholder still in it rather than as an error.
  • Every occurrence is replaced, and a match anywhere counts — a Find of "AK" inside a list also hits "AKM" and "AK101". Pick markers that cannot occur by accident; braces around a placeholder are the usual habit for exactly that reason.
  • Do not use it to repair classname casing before a spawn. A classname has to be exactly right at the source ("GasMask", "Mag_STANAG_30Rnd"); patching one up in the graph only hides the typo.

Text Contains

purebothpure.textContains

True if the text contains the search text.

Inputs
Textstring
Search Forstring
Outputs
Foundbool

True when one piece of text appears anywhere inside another. It is a plain substring test — no wildcards, no word boundaries — so it answers "is this fragment in there", not "is this the same text".

When to use it

Checking membership in a list a server owner typed as one line: does "AKM,M4A1,SVD" contain the classname of the weapon in hand. Wire the result into Branch to act on it. When you want the two pieces to be identical, use Text Equals instead; when the list is long enough that a false match matters, walk it properly with Count Text Parts and Get Text Part.

Pins

Text — the haystack, usually a config line or a classname.

Search For — the needle. Case-sensitive, so it must be spelled exactly as it appears.

Example

A restricted-weapons zone. Add a config text field banned_weapons holding "AKM,M4A1,SVD". On Player Entered Zone: Get Item In Hands on the Player → Get Entity TypeText Contains with Text from Get Config Text ("banned_weapons") and Search For wired from that classname → Branch → on true, Send Notification warning them the weapon is not allowed here.

Owners edit one config line to change the rule; the graph never changes.

Watch out

  • Case-sensitive, the same trap as everywhere else with classnames: "Aug" is not "AUG", "GasMask" is not "Gasmask", and a wrong-case search is silently false forever.
  • A substring match is looser than it looks. "AK" matches "AKM" and "AK101"; "M4" matches "M4A1". Search for the full classname, and remember a short one can still sit inside a longer one in the same list — "Mag_AKM_30Rnd" contains "AKM".
  • An empty Search For is not a question worth asking. When the needle comes from a lookup that can fail — an item that was not there, a config field left blank — check the source rather than trusting whatever this node returns for an empty string.

Text Equals

purebothpure.textEquals

True when both texts are exactly the same (case matters).

Inputs
Astring
Bstring
Outputs
Equalbool

True when two texts are exactly the same, character for character, case included. This is the standard gate for "is this the classname / tag / ID I care about" — wire its Equal output into a Branch condition.

When to use it

Comparing classnames, item tags, Steam IDs, or pieces pulled out of config text. For numbers use Equals (Numbers) — comparing numbers as text fails in surprising ways ("7" is not "7.0"). For a looser "does it contain" match, use Text Contains.

Example

A whole gas-mask protection check is this one compare: Get Attachment In Slot ("Mask") → Get Entity TypeText Equals (B = "GasMask") → Branch — the True path is a protected player, the False path takes the damage.

Two more shapes worth knowing. Tag the items your mod spawns with Tag Item ("my_drop"), then Get Item TagText Equals (B = "my_drop") tells your pickup logic which crates are yours and which are the map's own loot. And comparing two Get Player Steam ID values — killer against victim — is how you drop self-inflicted deaths before paying out a reward.

Watch out

  • Case matters and a mismatch fails silently, forever: "GasMask" is not

"Gasmask", "Aug" is not "AUG". Copy classnames exactly.

  • Nothing is trimmed. An invisible trailing space in a config value makes two

visually identical texts unequal — Get Text Part and Get Setting trim their output, which is usually why lists "just work" while hand-joined text does not.

  • For a case-insensitive compare, run both sides through

Change Text Case first.

Text To Number

purebothpure.textToNumber

Turns text into a number: "250" gives 250. Text that is not a number gives 0.

Inputs
Textstring
Outputs
Numberfloat

Turns text into a number: "250" gives 250, "0.5" gives 0.5. Numbers that travel inside config text — a radius encoded in a settings string, a piece of a comma list — arrive as text; this node makes them usable as real numbers again.

When to use it

Right after Get Setting or Get Text Part when the piece you pulled out is numeric. The reverse direction needs no node: wiring a number into a text pin converts on its own.

Example

A config list where each entry describes a zone — "name=Quarry; center=4600 0 10300; radius=120" — hides its radius inside text. Get Config Text At (zones) → Get Setting ("radius") → Text To NumberSet Global Number ("zone radius") turns it into a real number, which the enforcement loop can then compare a Distance Between result against.

Watch out

Text that is not a number gives 0 — silently. A typo like "12O" (letter O) becomes 0, and a zero radius or zero delay usually looks like the feature simply not working. When 0 would be harmful, branch on the value before using it.

Text To Position

purebothpure.textToPosition

Turns text into a position: "7500 0 7500" gives that point in the world. Write the three numbers separated by spaces. Anything else gives 0 0 0.

Inputs
Textstring
Outputs
Positionvector

Turns text into a world position: "7500 0 7500" becomes that point on the map. Three numbers separated by spaces — X (west-east), height, Z (south-north). Positions that ride inside config text arrive as strings; this node makes them places again.

When to use it

After Get Setting pulls a "center=4600 0 10300" value out of a structured config entry. When the config field is a real position field, use Get Config Position directly and skip the text round-trip.

Example

A config list where one entry describes a whole zone, "name=Quarry; center=4600 0 10300; radius=120": Get Config Text At (zones) → Get Setting ("center") → Text To PositionSnap To Ground, giving the zone's centre point. Writing the height as 0 is fine because Snap To Ground drops the point onto the terrain afterwards.

Watch out

Anything that is not three space-separated numbers gives 0 0 0 — and that is a real place, the map's south-west corner, usually open ocean. Teleporting players to a mistyped position sends them swimming. When the text comes from a config an owner edits, sanity-check it (for example, branch on the position being different from 0 0 0) before using it as a destination.

Values/UI

Get Slider Value

pureclientpure.uiGetSliderValue

A slider's current value in the open menu.

Outputs
Valuefloat
Settings
Menu LayoutlayoutPickerrequired
SliderwidgetPickerrequired

The current position of a named slider in an open menu, as a number. It finds the menu on screen for the layout you picked, looks the widget up by name and reads where the handle sits. A menu that is not open, or a name that is not a slider, gives 0 rather than an error.

What the number *means* is decided in the layout editor, not here — the slider's own range is part of the widget, so a slider set up to run 0 to 100 reports a percentage and one set up to run 0 to 10 reports a small count.

When to use it

Under On Button Clicked, to read how far the player pushed a slider before committing. It is the number-shaped member of the same family as Get Text Box Text and Is Checkbox Checked, and like them it is meant to be pulled at the moment of the click rather than watched continuously.

Pins

Menu Layout / Slider — panel pickers, not wires. The layout must be attached to the project; the Slider dropdown then lists the named widgets in it.

Example

An admin panel that sets a player's health. The layout holds a slider named sld_health running 0 to 100 and a button named btn_apply. On Button Clicked (btn_apply) → Set Player Health, with Get Slider Value (sld_health) wired into the health pin. Set Player Health is server work, so the slider is read on the player's machine and its value travels to the server with the click.

Using the same slider as a *count* takes one more node: Get Slider ValueTo Whole Number → the Times pin of Repeat. The reading is a decimal, and counting pins only take whole numbers.

Watch out

  • The menu has to be open when the read happens, and readings that get sent to the server happen at the hand-off point — after anything earlier in the chain, including an Close Menu. A slider value that always arrives as 0 on the server usually means the menu was closed first.
  • The value is a decimal, whatever the slider looks like. Whole-number pins need To Whole Number, and Clamp Number is worth adding when the pin has a range of its own that the slider's range does not match.
  • Client-side, so players need the mod (Server + Client), and every node touching the menu must come before the first server node in the chain.
  • The number comes from the player's machine. Do not trust it to be inside the slider's range on the server side — clamp anything that decides a cost or a quantity.

Get Text Box Text

pureclientpure.uiGetTextBoxText

Reads a text box's current contents from the open menu.

Outputs
Textstring
Settings
Menu LayoutlayoutPickerrequired
Text BoxwidgetPickerrequired

Reads whatever is currently typed into a named text box of an open menu. It finds the menu on screen for the layout you picked, looks up the widget by name, and hands back its contents. Nothing is ever an error: if that menu is not open, or the name does not belong to a text box, you get empty text.

This is the pull half of a menu. On Text Box Changed pushes at you on every keystroke; this node waits until you ask, which is almost always the better shape.

When to use it

At the moment a decision is made — under On Button Clicked, reading the boxes the player filled in before clicking. That is the normal form of a NodeZ menu: several inputs, one button that reads them all at once. Its siblings for the other widget kinds are Is Checkbox Checked and Get Slider Value.

Pins

Menu Layout / Text Box — panel pickers, not wires. The layout has to be attached to the project; the Text Box dropdown then lists the named widgets inside it.

Example

A teleport-by-coordinates admin menu. The layout holds edit boxes named box_x and box_z, a label named lbl_status, and a button named btn_go.

On Button Clicked (btn_go) → Set Widget Text (lbl_status, "Teleporting...") → Teleport Player. The position comes from Get Text Box Text (box_x) → Text To Number into the X pin of Make Position, the same pair from box_z into Z, Y left at 0, and the result through Snap To Ground so the height is right for the terrain. Teleport Player is server work, so the two box readings happen on the client and travel to the server with the rest of the click.

Watch out

  • The menu has to be open when the read happens — this reads the live menu, not a saved value, and a closed one gives empty text. In particular, the readings sent to the server happen at the point the chain hands off, after everything earlier in the chain including an Close Menu. If a text value arrives empty on the server, take the close out of that chain.
  • A HUD overlay is not a menu. Show HUD Overlay can put the same layout on screen as an always-on overlay, but this node will not read from it — it only sees the generated menu.
  • Client-side, so players need the mod (Server + Client), and everything touching the menu must come before the first server node.
  • The text arrives exactly as typed, case and spaces included. A classname a player typed by hand only works if the case is right, and Text Equals does not forgive it. At most ten widget values can ride across to the server from one click.

Is Checkbox Checked

pureclientpure.uiIsCheckboxChecked

True when a checkbox in the open menu is ticked.

Outputs
Checkedbool
Settings
Menu LayoutlayoutPickerrequired
CheckboxwidgetPickerrequired

True when the named checkbox in an open menu is ticked. It finds the menu on screen for the layout you picked, looks up the widget by name, and reports its state. A menu that is not open, or a name that is not a checkbox, gives false rather than an error.

When to use it

At the moment the player commits — under On Button Clicked, reading every option box the menu offers. That is nearly always better than reacting to each tick with On Checkbox Changed, because the player is free to change their mind right up until they click. Its siblings for the other widget kinds are Get Text Box Text and Get Slider Value.

Pins

Menu Layout / Checkbox — panel pickers, not wires. The layout must be attached to the project; the Checkbox dropdown then lists the named widgets in it.

Example

A kit menu with an optional extra. The layout holds a button named btn_kit and a checkbox named chk_ammo.

On Button Clicked (btn_kit) → Give Weapon (M4A1, no magazine) → Branch with Is Checkbox Checked (chk_ammo) wired into its condition → the True path runs Give Item To Player (Mag_STANAG_30Rnd). Give Weapon is server work, so the chain hands off there; the tick is read on the player's machine and carried across with the hand-off, and the branch then runs on the server with the answer already in hand.

Watch out

  • The menu has to be open when the read happens, and the reads that get sent to the server happen at the hand-off point — after anything earlier in the chain, including an Close Menu. If a checkbox always seems to be false on the server, take the close out of that chain.
  • A checkbox is not a saved setting. The menu is rebuilt every time it opens, so the box goes back to whatever the layout says it should be. Store the answer yourself with Set Player Number or Set Saved Player Number if it has to survive.
  • Client-side, so players need the mod (Server + Client), and every node that touches the menu must come before the first server node.
  • A tick is a request from the player's machine, not a fact. Put the checks that matter — cost, cooldown, permission — on the server side of the chain.

Values/Variables

Get Global Number

pureserverpure.getGlobalNumber

Reads a global number by name (0 if it was never set).

Outputs
Valuefloat
Settings
Nametext · default "score"required

Reads a number the whole server shares, stored under a name by Set Global Number or Add To Global Number. A name nothing ever wrote reads 0.

"Global" is meant literally: one slot per name, one value for everyone, kept in memory only. A restart puts it back to 0. Think of it as the mod's scratchpad for this uptime — which round is running, how many drops have been handed out, how much of a shared pool is left.

When to use it

Server-wide counters and state. When the number belongs to one *person*, use Get Player Number instead, or everybody shares it. When it has to survive a restart, use Get Saved Number — that is a separate store with its own names, so "total" as a global and "total" as a saved number are two unrelated values that never see each other.

Example

A round counter driving an announcement: Every N Seconds (600) → Add To Global Number ("round", 1) → Get Global Number ("round") → Join Text ("Round ") → Broadcast Notification. Writer and reader agree on nothing but the Name, and that is the whole contract.

The same slot used as a cap: On Player DiedGet Global Number ("drops") → Less Than (10) → Branch; the True path spawns the reward and then runs Add To Global Number ("drops", 1). No more than ten drops exist per uptime, however busy the server gets.

Watch out

  • It resets to 0 on every restart, quietly. Anything you would be annoyed to lose belongs in Get Saved Number.
  • One value for everybody — which is the classic loadout bug. Write a roll to a global, wait with Delay, read it back, and another player's event has overwritten it during the wait, so two players get each other's kit. Stamp per-player values onto the player with Set Player Number and read them back with Get Player Number instead.
  • Names are stripped down to letters, digits and underscores before they become the slot. "round score" and "roundscore" end up as the same slot; "Score" and "score" stay different ones. Keep names simple and type them identically everywhere.
  • A never-written name reads 0, which is indistinguishable from a real 0. Where "unset" has to mean something, write a starting value at On Server Started.

Get Global Position

pureserverpure.getGlobalPosition

Reads a position stored under a name (0 0 0 if never set).

Outputs
Positionvector
Settings
Nametext · default "point"required

Reads back a map position stored under a name by Set Global Position. A name nothing ever wrote reads "0 0 0" — which is not a harmless blank, it is the far corner of the map.

Most positions in a graph are worked out and used on the spot. This slot is for the ones that have to travel: a spot chosen inside a loop and used after it, a drop site rolled by one event and honoured by another, a rolled value that must stay the same at every later use.

When to use it

Carrying a computed position across a boundary a wire cannot cross. For a fixed spot that never changes, type it straight into the node that needs it — or better, put it in the project config and read it with Get Config Position, so a server owner can move it without opening the editor.

Example

Roll a drop site once, then use it twice: Daily At Time (Hour 12) → Random Config Position (your "dropSites" list) → Set Global Position ("drop") → Broadcast Notification ("A drop is inbound") → Delay (60 seconds) → Get Global Position ("drop") → Spawn Item (SeaChest) → Tag Item ("drop").

Storing the roll is the point. Random Config Position gives a *different* answer at every wired use, so reading it again after the wait would land the crate somewhere other than the site just announced. One roll, one slot, read wherever it is needed.

Watch out

  • "0 0 0" is what an unset name gives, and it is a real place on the map — spawning there is silent and baffling. Write a sensible starting value at On Server Started rather than trusting the slot to be empty-looking.
  • Wiped by a restart, like every global.
  • One slot per name, shared by everyone. A global written before a Delay can be overwritten by another player's event during the wait; where the position belongs to one player, keep it on them instead.
  • Global positions, global numbers and remembered items are separate slots, so the same Name can be used for one of each.
  • Names are stripped down to letters, digits and underscores, so "drop site" and "dropsite" become the same slot.

Get Player Number

pureserverpure.getPlayerNumber

Reads a number stored on a player by name (0 if never set).

Inputs
Playerplayer
Outputs
Valuefloat
Settings
Nametext · default "team"required

Reads a number stored on one player by Set Player Number or Add To Player Number. A name nothing ever wrote reads 0.

The value lives on that player's character, in memory, for as long as they are on the server: which team they are on, how many kills this round, whether they have already claimed today's reward. Nothing is written to disk, and no other player can see it.

When to use it

Per-player state that only needs to last the session. Use Get Global Number when the value belongs to the server rather than a person, and Get Saved Player Number when it has to still be there tomorrow. For text rather than a number, Get Player Text.

Example

Team-based friendly-fire protection. Stamp the team on arrival: On Player ReadySet Player Number ("team", 1). Then police it: On Player Took DamageIs Valid (Attacker) → Branch; on True, Get Player Number ("team") on the Victim and again on the Attacker → Equals (Numbers) → a second Branch → the True path runs Heal Player Fully on the victim and Send Notification ("Friendly fire") to the attacker. Same team, damage undone.

Watch out

  • Session only. The store lives on the character object, so it goes when the player disconnects — and a respawn builds a new character, so anything stamped before a death is gone afterwards. Use Set Saved Player Number when that is a problem, and re-stamp on On Player Respawned when it is not.
  • Never written to disk. A restart clears every player's values.
  • 0 is both "never set" and a real zero. Where the difference matters, write an explicit starting value at On Player Ready.
  • Names here are used exactly as you type them, capitals and spaces included, so "Team" and "team" are two different values. (Global numbers behave differently — those get stripped down first.)

Get Player Text

pureserverpure.getPlayerText

Reads text stored on a player by Set Player Text (empty if never set).

Inputs
Playerplayer
Outputs
Valuestring
Settings
Nametext · default "tag"required

Reads a line of text stored on one player by Set Player Text. Empty if that name was never written.

Its most valuable use is remembering *another* player. A player wire held across time is fragile — they die, respawn, disconnect — but a Steam ID is only text, and text keeps. Store the ID here, look the person back up later with Get Player By Steam ID, and if they have gone the lookup simply comes back empty instead of breaking the chain.

When to use it

Per-player labels and references for this session: last attacker, chosen class, which zone they are standing in. Numbers belong in Get Player Number. There is no saved *text*, so anything that must outlive the session either becomes a number in Get Saved Player Number or gets rebuilt from scratch on the next join.

Example

Kill credit that survives a slow death. Record the hit: On Player Took DamageGet Player Steam ID on the Attacker and again on the Victim → Text EqualsNotBranch throws away self-inflicted damage; the True path runs Set Player Text on the Victim, Name "last_attacker", Value the attacker's ID.

Then pay it out: On Player DiedGet Player Text ("last_attacker") on the Victim → Get Player By Steam IDIs ValidBranchGive Item To Player (Rag) and Send Notification. A player who bleeds out a minute after the last shot still credits the shooter, and a shooter who logged off in between just fails the Is Valid.

Watch out

  • Session only, never saved. The store lives on the character, so it is gone when the player leaves, and a respawn starts a fresh character with nothing on it.
  • Empty text is what an unwritten name gives. Treat empty as "no value" rather than comparing against some placeholder.
  • Names are matched exactly as typed, capitals and spaces included.
  • The text is only as durable as what you put in it. A Steam ID never changes; a player's *name* does, so Get Player Name is a poor thing to store and match on later.

Get Remembered Item

pureserverpure.getGlobalItem

Reads back an item stored by Remember Item (empty if it was never set, or is gone).

Outputs
Itementity
Settings
Nametext · default "item"required

Reads back the item Remember Item ("Remember Item") stored under a name. Empty if nothing was ever stored there — and empty again once the item has been destroyed.

The pair exists to carry "the thing I just made" across a gap a wire cannot reach: into the next pass of a loop, into a different event, or simply further down a very long chain. It is a note of where an item is, not a grip on it.

When to use it

Building something up in stages, or watching something you placed. Spawn a crate at server start, remember it, and let a timer check on it every minute. Attach a part to a rifle, remember the rifle, attach the next part to the remembered one. When the value you need to carry is a number, a position or a line of text, the matching getters are Get Global Number, Get Global Position and Get Player Text.

Pins

Item — comes back empty both when the slot was never filled and when the item no longer exists. Test with Is Valid before every use, not just the first one.

Example

Watching a stash you placed: On Server StartedSpawn Item (SeaChest, "7500 0 7500") → Remember Item ("crate"). Then Every N Seconds (30) → Get Remembered Item ("crate") → Is ValidBranch; on True, Get Entity PositionCount Players Near (Radius 15) → Greater Than (0) → a second BranchBroadcast Notification ("Someone is at the stash").

The Is Valid is the whole trick. The moment a player destroys the crate the slot reads empty, and without the guard the position read has nothing to work on and the tick dies there.

Watch out

  • This is a weak handle. It does not keep the item alive; when the item goes, the slot silently becomes empty. It is for carrying something through a chain, never for long-term storage.
  • One slot per name, shared by the whole server. Two players triggering the same graph in the same moment overwrite each other's item.
  • After a Delay only the carried player survives, and a remembered item is exactly the kind of thing another player's event overwrites during the wait. Re-find the item on the far side of the delay, or stamp what you need onto the player with Set Player Text before the wait.
  • Remembered items, global numbers and global positions live in separate slots, so the same Name can be used for one of each without them colliding.

Get Saved Number

pureserverpure.getSavedNumber

Reads a saved number by name (0 if it was never set).

Outputs
Valuefloat
Settings
Nametext · default "total"required

Reads a number that survives a server restart. A name nothing ever wrote reads 0.

Saved numbers live in a small JSON file the generated mod keeps in the server's profile folder, at $profile:<YourMod>/persist.json, and it is rewritten the instant anything changes. That makes them the right home for a season total, a global event counter or the id of the round in progress — and the wrong home for a value that changes many times a second.

When to use it

Server-wide values that must outlive an uptime. Get Global Number is the in-memory equivalent and is what you want for anything that *should* reset on restart. The two are completely separate stores: a global named "total" and a saved number named "total" never see each other. For a number belonging to one person, use Get Saved Player Number.

Example

Airdrop numbering that keeps counting across restarts: Daily At Time (Hour 12) → Add To Saved Number ("drop_no", 1) → Get Saved Number ("drop_no") → Join Text ("Airdrop #") → Broadcast Notification. The file is plain text, so a server owner can open persist.json between seasons and set the count back to 0 by hand.

Watch out

  • Every write rewrites the whole file. Do not put one under an Every N Seconds ticking at a second or two, or inside a loop that runs over every player constantly — keep the busy running total in Set Global Number and save it occasionally.
  • Names are used exactly as typed, capitals and spaces included, unlike global-number names.
  • Reading before anything wrote gives 0, which is indistinguishable from a stored 0.
  • The store is server-side. A chain running on the player's own machine — anything under On Client Message — reads 0 no matter what the file says. Send the value across in the message with Send Client Message and read it from the message's pins instead.

Get Saved Player Number

pureserverpure.getSavedPlayerNumber

Reads a player's saved number by name (0 if they have none yet).

Inputs
Playerplayer
Outputs
Valuefloat
Settings
Nametext · default "kills"required

Reads a number kept on disk against one player. A player who has none yet reads 0.

The key is their Steam ID, not their character, so the value follows the *person*. It is still there after they die and respawn with a fresh character, after they log off and come back tomorrow, and after a server restart. Kills, deaths, money, points, a "has claimed the starter kit" flag — this is where a stats system lives. It is written into $profile:<YourMod>/persist.json alongside the plain saved numbers, under a key built from the Steam ID and the name, so one player's "kills" can never collide with another's.

When to use it

Anything a player is entitled to keep. Get Player Number is the session-only version — same shape, no file — and is the better choice for values that *should* reset, like which team they are on this match. There is no saved text; when you need to keep a name or an id, store a number here and rebuild the text, or use Set Player Text for the session.

Example

A lifetime scoreboard. Bank it on death: On Player DiedIs Valid (Killer) → Branch; the True path runs Add To Saved Player Number ("kills", 1) on the Killer and Add To Saved Player Number ("deaths", 1) on the Victim. Then show it back on the next join: On Player ReadyGet Saved Player Number ("kills") → Join Text ("Welcome back — kills: ") → Send Notification. The player sees their real running total, not this session's.

Watch out

  • The value is keyed on the player's network identity. A player who no longer has one — a corpse whose owner has already disconnected — reads back 0, and a write against them is silently dropped. Do the bookkeeping while they are still connected; On Player Died is a good moment, and anything after On Player Left is not.
  • Every write rewrites the whole save file, so this belongs in events that fire per kill or per join, not in an Every N Seconds tick walking every player online.
  • Names are used exactly as typed, capitals and spaces included.
  • It is a server-side store. A chain running on the player's own machine, under On Client Message, reads 0 whatever the file holds — send the number over in the message with Send Client Message instead.

Values/Vehicles

Get Vehicle Fuel

pureserverpure.getVehicleFuel

A vehicle's fuel level as a 0-1 percentage (0 = empty, 1 = full).

Inputs
Vehicleentity
Outputs
Fuel %float

How full a car's fuel tank is, as a fraction: 0 is dry, 0.5 is half, 1 is brim full. Not litres — a fraction, so the same test works on a hatchback and on a truck.

When to use it

Warning a driver they are running low, or deciding whether a service point should top them up. To actually add fuel, Refuel Vehicle does it (its Fill To Full mode saves you the arithmetic).

Pins

Vehicle — a car from Get Player Vehicle, On Player Entered Vehicle, On Vehicle Engine Started or Spawn Vehicle.

Example

A warning as the driver sits down: On Player Entered VehicleGet Vehicle Fuel (Vehicle from the event) → Less Than (B = 0.15) → Branch → true: Send Notification (Player from the event, "Fuel", "This vehicle is nearly empty").

Watch out

  • Anything that is not a car reads 0, and so does an empty wire. A zero can therefore mean "empty tank" or "that was not a vehicle" — check the wire with Is Valid when the difference matters.
  • It is 0-1, not 0-100. Comparing against 20 is always true.

Get Vehicle Speed

pureserverpure.getVehicleSpeed

A vehicle's current speed in km/h.

Inputs
Vehicleentity
Outputs
Speed (km/h)float

How fast a car is going right now, in km/h, the same number its speedometer shows. It is always positive — reversing at 20 reads as 20, not -20.

When to use it

Speed rules: a warning above some limit, a safe-zone that only lets slow traffic through, or simply refusing to run something while the car is moving. Pair it with Every N Seconds and For Each Player to watch every driver, since there is no "vehicle moved" event to hang it on.

Pins

Vehicle — a car from Get Player Vehicle, On Player Entered Vehicle or Spawn Vehicle.

Example

A speeding warning checked every five seconds: Every N Seconds (5) → For Each PlayerGet Player Vehicle (the loop's Player) → Get Vehicle SpeedGreater Than (B = 90) → Branch → true: Send Notification ("Slow down", "You are driving too fast").

A player on foot has no vehicle, so the speed reads 0 and the branch never fires — no extra check needed.

Watch out

  • Non-cars and empty wires both read 0, which is why the example above is safe but a test for "is stopped" is not: 0 also means "there was no vehicle".
  • The reading is a snapshot. Sampling every few seconds misses a short burst of speed between samples.

Is Engine Running

pureserverpure.isEngineRunning

True while a vehicle's engine is running. The counterpart to Vehicle Engine (start/stop).

Inputs
Vehicleentity
Outputs
Runningbool

True while a car's engine is turning over. It is the read side of Vehicle Engine, which starts and stops engines.

When to use it

Guarding anything that should not happen to a running car, or spotting an engine left idling. On Vehicle Engine Started tells you the moment an engine starts; this node answers at any moment you choose to ask.

Pins

Vehicle — a car from Get Player Vehicle, On Player Entered Vehicle or Spawn Vehicle. The Target of a world interaction is a plain object and will not fit here, so read the car from its driver instead.

Example

Engines off inside a trader zone: While Player In Zone (Center Position 7500 0 7500, Radius 40, Every 5 seconds) → Get Player Vehicle (the event's Player) → Is Engine RunningBranch → true: Vehicle Engine (Mode "Stop") and Send Notification ("Trader", "Engines are switched off here").

A player on foot has no vehicle, the check reads false, and the branch never fires — no extra guard needed.

Watch out

  • Anything that is not a car reads false, and so does an empty wire, so "false" is not proof there was a vehicle at all. Confirm with Is Valid when the difference matters.
  • It is a snapshot, not an event. A driver who starts and stops between two checks is never seen.

Values/World

Count Players Near

pureserverpure.countPlayersNear

How many players are within a radius of a position.

Inputs
Positionvector
Radius (m)float
Outputs
Countint

A headcount inside a circle: how many players are within a given distance of a map position. It asks the engine's central economy — the same system that decides whether an area is too busy to spawn loot in — so it costs one call no matter how many players are online.

When to use it

Deciding whether somewhere is busy or empty: only start an event when enough people are around, only drop a crate where nobody is watching, size a reward to the crowd. For the whole server's headcount use Get Online Player Count; to actually do something to each of those players use For Each Player Near; to find the single closest one use Get Nearest Player, and for the distance to the closest living player use Distance To Nearest Player.

Pins

Position — the centre of the circle, in map coordinates. It starts at 0 0 0, which is the corner of the map: type real coordinates or wire a position in, or the answer is always 0.

Radius (m) — how far out to look, in metres.

Example

An event that only runs when there is an audience: Every N Seconds (60) → Count Players Near (7500 0 7500, radius 150) → Greater Than (3) → Branch → the True side runs Do OnceBroadcast Notification ("Airdrop", "Supplies inbound", 12 seconds) → Spawn Item (SeaChest at 7500 0 7500). Without the Do Once the announcement repeats every minute the crowd stays.

Watch out

  • The count comes from the central economy, which is not running on every mission type. Where it is absent — an offline test mission, for instance — this node returns 0 rather than failing, so a "nobody is nearby" test passes even in a packed town. Confirm the behaviour on the real server before trusting it.
  • You cannot filter what it counts. If the dead must not count, or one particular player must be excluded, walk the players yourself with For Each Player Near, gate on Is Player Alive and tally with Counter.
  • A position that comes from a volatile source such as Random Point Near re-rolls at every use, so the spot you counted and the spot you then build on are not the same place. Store the roll once with Set Global Position and read it back with Get Global Position everywhere.

Get Ground Surface

pureserverpure.getSurfaceType

The name of the ground surface at a position (e.g. "cp_grass", "cp_concrete"). Empty over water or off-map.

Inputs
Positionvector
Outputs
Surfacestring

The name of the terrain material under a map position, as text — "cp_grass", "cp_concrete" and the rest. These are the map's own surface names, the same ones the engine reads to pick footstep sounds and bullet impacts.

It reads the *terrain*, using only the east-west and north-south parts of the position. The height is ignored entirely, so a point on a rooftop or inside a building reports the ground far below it, not the floor the player is standing on.

When to use it

Sanity-checking a spot before you build on it: refuse to drop a crate in the sea, only start a campfire event on soil, keep vehicle spawns on roads. For "is anyone here" checks use Count Players Near; to put a position onto the ground before using it, Snap To Ground.

Example

Only dropping supplies on open ground. Every N Seconds (600) → Random Point Near (7500 0 7500, radius 400) stored with Set Global Position (name drop_point). Then read it back with Get Global PositionGet Ground SurfaceText Contains ("grass") → Branch, and the True side reads drop_point again into Spawn Item (SeaChest). Testing and spawning both use the stored position, so they are guaranteed to be the same place.

Watch out

  • Store the position before you test it. A point straight out of Random Point Near re-rolls at every use, so testing the surface at one roll and spawning at another is the default outcome — that is what the Set Global Position step above prevents.
  • Height is ignored. This can never tell you what a player is standing on inside a building; it answers about the terrain at those map coordinates.
  • Surface names differ from map to map, and comparisons are case-sensitive. Match a fragment with Text Contains ("grass", "concrete") rather than demanding an exact string with Text Equals, and check the real names your map uses by printing a few with Log Message before you build rules on them.
  • Over water or off the map edge the result is empty text, which no "contains" test will match — that is usually the answer you want, but it means an empty result and a mistyped surface name look identical.

Get In-Game Time

pureserverpure.getInGameHour

The current in-game hour as a number (13.5 = 1:30 PM). Great for night-only events.

Outputs
Hourfloat

The server's day/night clock as one decimal number. 0 is midnight, 12 is noon, 13.5 is half past one in the afternoon. It is the in-game sun clock — it runs at whatever speed your server's time acceleration is set to, and has nothing to do with the real-world time on the machine.

The decimal part is the minutes as a fraction: .25 is quarter past, .5 is half past. Whole minutes come out of (hour - the whole hour) x 60.

When to use it

Time-of-day rules where the exact hour matters — a trader that only buys between 08:00 and 20:00, a curfew at 22:00, an event that fires in the small hours. For a plain "is it dark" test, Is Night Time is simpler and follows the sun properly. For the date and whole-number hour and minute together, use Get Server Date & Time. For the real-world clock of the server machine, use Get Date & Time Text.

Example

A curfew warning: Every N Seconds (60) → Get In-Game TimeGreater Than (22) → Branch → the True side runs Broadcast Notification ("Curfew", "Get indoors", 10 seconds). Adding Do Once before the notification keeps it to a single announcement instead of one a minute.

Splitting it for display: Get In-Game TimeTo Whole Number gives the hour, and the same reading through Subtract (that whole hour) → Multiply (60) → To Whole Number gives the minutes, ready for Join Text.

Watch out

  • The clock wraps at 24 back to 0. A window that crosses midnight — 22:00 to 04:00 — cannot be one range test; check "after 22" and "before 4" separately and join them with Or.
  • It is in-game hours, not real ones. With time acceleration on, an in-game hour can pass in minutes of real time, so a graph that polls once an in-game hour needs a much shorter timer than 3600 seconds. Set Time Acceleration changes that speed under you.
  • The value is a decimal. Feeding it to anything that wants a whole number (Remainder (Modulo), for instance) needs To Whole Number first.
  • Server-side. To show the time on a HUD, read it on the server and send it across with Broadcast Client Message.

Get Nearest Player

pureserverpure.getNearestPlayer

The closest player to a position, within a radius. Empty if nobody is close enough — check with Is Valid.

Inputs
Positionvector
Within (m)float
Outputs
Playerplayer

Hands you the closest player to a point — the person, not a number — so you can message them, reward them or check what they are carrying. The generated code walks every player on the server, measures the straight-line distance to your position, and keeps the smallest one inside the radius you gave.

When nobody is inside that radius it comes back empty. That is a normal, expected answer, not an error, and every graph using this node has to handle it.

When to use it

"Whoever is standing at this spot" problems: crediting the first player to reach a drop, greeting whoever walks up to a landmark, picking a target for an effect at a fixed place. For how far away that closest person is, use Distance To Nearest Player; for a headcount rather than a person, Count Players Near; and when every nearby player matters, loop with For Each Player Near.

Pins

Position — the point to search around, in map coordinates. It starts at 0 0 0, the corner of the map.

Within (m) — the search radius. A player exactly on the edge still counts.

Player — the closest one found, or empty when nobody qualified. Always test it with Is Valid before using it.

Example

Crediting whoever reaches a supply crate: On Server StartedSpawn Item (SeaChest at 7500 0 7500). Then Every N Seconds (10) → Get Nearest Player (7500 0 7500, Within 15) → Is ValidBranch → the True side runs Do OnceSend Chat Message ("You found the supply drop") with that Player wired in, then Broadcast Chat Message announcing it to the server. The Is Valid gate is what stops the graph doing anything for the nine minutes nobody is there.

Watch out

  • A corpse is still a player. Dead bodies stay in the engine's player list until they despawn, so a body lying on the spot wins the search and quietly collects whatever the graph hands out. Gate on Is Player Alive whenever that matters.
  • The radius is a sphere measured in three dimensions, height included. A position typed with a height of 0 while the players stand on a hillside 200 m above sea level matches nobody — take the height from a real position (Get Player Position, Get Entity Position) or put the point on the ground with Snap To Ground.
  • The Player pin can be empty, and an empty player wired into an action is not always a quiet no-op. Branch on Is Valid first rather than letting it through.
  • Server-side. This runs where the player list lives; a HUD cannot ask the question itself.

Get Server Uptime

pureserverpure.getServerUptime

How many seconds the server has been running. Useful for restart warnings.

Outputs
Secondsfloat

How long the server process has been running, in seconds. It starts at 0 when the server boots and climbs from there — a plain number you can compare and subtract, which is what makes it the right tool for scheduling against a restart cycle.

When to use it

Restart warnings and anything measured in elapsed time: "warn at 3 h 50 m into a four-hour cycle", "how long since this event started". For the real-world date and time as readable text, use Get Date & Time Text; for the in-game sun clock, Get In-Game Time.

Example

A restart countdown on a four-hour cycle (14400 seconds): Every N Seconds (30) → Get Server UptimeGreater Than (14100) → Branch → the True side runs Do OnceBroadcast Notification ("Restart", "Server restarts in 5 minutes", 20 seconds). The Do Once is what stops the warning repeating every 30 seconds for the rest of the cycle.

Measuring a duration: store Get Server Uptime with Set Global Number when an event begins, then subtract that stored value from a fresh reading later (Subtract) to get the elapsed seconds.

Watch out

  • It resets to 0 on every restart. Any stored "last warned at" number must be reset too — a Set Saved Number holding 14100 from the previous session will look like the future forever. Session-lifetime globals (Set Global Number) clear themselves on restart, which is usually what you want here.
  • It is not a wall clock. You cannot get today's date from it; for log stamps use Get Date & Time Text.
  • It counts the server's running time, not the mission's — a mod loaded at boot sees the same clock as the engine.

Get Weather Level

pureserverpure.getWeatherLevel

Reads a weather value (0-1 for overcast/rain/fog/snow, or wind speed in m/s).

Outputs
Levelfloat
Settings
Typeselect · Overcast | Rain | Fog | Snow | Wind Speed · default "Overcast"required

Reads one channel of the server's weather as a number. Overcast, Rain, Fog and Snow each come back on a 0 to 1 scale, where 0 is none and 1 is as heavy as the engine goes. Wind Speed is the odd one out: it is metres per second, so it runs well past 1.

The reading is the value *right now*, not the value the weather is heading towards. DayZ moves weather gradually, so a channel that has been told to reach 1 over five minutes reports everything in between while it gets there.

When to use it

Weather-driven rules: a bonus that only applies in fog, an event that waits for a storm, a HUD line telling players what is coming. To change the weather instead of reading it, use Set Weather, Set Thunderstorm and Set Wind Speed.

Pins

Type (panel) — which channel to read. Overcast, Rain, Fog and Snow give 0-1; Wind Speed gives metres per second. One node reads one channel, so a graph that needs both rain and overcast uses two nodes.

Example

Waiting for weather you started yourself: On Server StartedSet Weather (Overcast, Amount 1, Over Seconds 300). Then Every N Seconds (30) → Get Weather Level (Overcast) → Greater Than (0.9) → Branch → the True side runs Do OnceBroadcast Notification ("Storm front", "The sky has closed in", 10 seconds). The announcement lands when the sky has actually finished darkening, not five minutes early.

Watch out

  • Setting weather does not change this reading immediately. Set Weather hands the engine a target and an "over seconds" ramp; read the level in the same instant and you get the old value. Poll it on a timer if you need to know when the change has landed.
  • Rain and overcast are separate channels, and vanilla only drops rain when overcast is high. A Rain reading above 0 under a clear sky means nothing is falling — check both if "is it raining on players" is the real question.
  • Wind Speed is not on the 0-1 scale. A threshold of 0.8 that reads sensibly for rain is meaningless for wind, where normal values are single-digit metres per second.
  • Server-side. To put the weather on a player's HUD, read it on the server and send it with Broadcast Client Message.

Is Night Time

pureserverpure.isNight

True when it is currently night on the server.

Outputs
Is Nightbool

A yes/no answer to "is it dark out there right now". It asks the world itself, the same check vanilla uses to decide whether night-time rules apply — so it follows the sun, not a clock reading you have to interpret.

When to use it

Night-only behaviour: heavier infected spawns after dark, a curfew warning, a light that only turns on at night. When you need the actual hour — "between 22:00 and 23:00" — use Get In-Game Time instead. To change the time rather than read it, use Set Time Of Day.

Example

Every N Seconds (300) → Is Night TimeBranch → the True side runs Spawn Infected or Animal (ZmbM_SoldierNormal) at a town position, so the streets only get busier after dark.

Watch out

Custom

Custom

Custom Node

actionservercustom.callGraph

Runs one of this project's custom nodes (a graph you built) right here in the chain. Its pins come from the custom node's Node Inputs and Node Outputs. Edit those to change the pins everywhere it is used.

Settings
Custom node graphtextrequired

Runs one of your own custom nodes right here in the chain. A custom node is just another graph in the project — one you made with New Custom Node in the graph tab menu (or by right-clicking a normal graph tab and converting it) — that starts at Node Inputs and optionally ends at Node Outputs. Dropping this node from the palette's Custom Nodes section places a call to it.

Its pins are not its own. They mirror the custom node's boundary: every pin you add to that graph's Node Inputs becomes an input here, every pin on its Node Outputs becomes an output. Change the boundary once and every placement in every graph updates.

At build time nothing is "called" in the usual sense — the compiler copies the custom node's logic into each place you dropped it. That is why a custom node containing Do Once, Flip Flop or Counter gets a separate latch per placement rather than one shared between them, which is almost always what you want.

When to use it

Any piece of wiring you have built twice. A "give the standard medic kit" chain, a "log this with a timestamp and a name" chain, a reward payout used by three different events — build it once as a custom node, then place it wherever it belongs. Repeating work *inside* one chain is a different job: Repeat and the For Each nodes do that. Raw Enforce Script belongs in Custom Script.

Pins

Everything except the exec pins comes from the custom node's boundary, in the order you added them there. Renaming a boundary pin renames it on every call; deleting one drops the wires that used it.

Unwired inputs are not an error. They arrive as a safe blank — 0 for numbers, empty text, nothing for a player or item — so the custom node's own guards decide what to do.

Example

A reusable "pay a player" node. In a new custom node graph, Node Inputs declares winner (Player) and amount (Whole number); the body runs Add To Saved Player Number ("points") on winner with amount in its Amount pin, then Get Saved Player Number ("points") → Join Text ("Total: " + points) → Send Notification aimed at winner.

Back in a normal graph, On Player DiedIs Valid (Killer) → Branch → your Custom Node with the Killer into winner and 10 into amount. Drop the same node under On Creature Killed with 1 instead of 10, and both events share one payout rule — change the payout once and both follow.

Watch out

  • Custom nodes cannot contain game events. A Node Inputs is the only

event-shaped node allowed inside one — put the real event in a normal graph and call the custom node from it.

  • They cannot call each other in a circle. A loop of calls would copy itself

forever, so the generator refuses it with a message naming the custom node that ends up running itself.

  • Deleting a custom node breaks every graph that calls it. The editor warns you

and tells you how many placements are affected; those nodes stop working until you remove them.

  • Set the custom node's outputs before any Delay inside it. Outputs

live in the calling chain, and a value assigned after a wait would arrive long after the caller moved on — the generator rejects that arrangement outright.

  • Each placement is normally its own copy, so a large custom node dropped in a

dozen places grows the generated mod. Keep them focused and small.

Custom Script

actionservercustom.script

Runs your own Enforce Script inside the flow. Add typed input/output pins and reference them by name in the code. Advanced. Your code is inserted as-is. Each input is a local variable; assign each output before the end.

Inputs
(exec)exec
Outputs
(exec)exec

The escape hatch. This node drops raw Enforce Script — DayZ's own scripting language — into the middle of your flow, for the rare thing no node covers. It is genuinely advanced: nothing here is checked for you, and a mistake shows up as a mod that fails to compile rather than as a message in the editor.

You give it typed pins and then use them by name. Each input becomes a variable holding whatever is wired in; each output is a variable your code assigns before it ends, and downstream nodes read it like any other pin. Your code goes in verbatim, wrapped in its own little block so two Custom Script nodes never tread on each other's variables.

When to use it

When the node library genuinely cannot reach something — a call into another mod's class, an engine function with no node, a bit of maths that would take fifteen nodes. Reach for it last. If the goal is to reuse wiring you have already built with nodes, Custom Node does that with no code at all, and to hook a method that has no event node, Override Method (Advanced) is the node built for it.

Pins

Inputs and outputs are yours to declare. Add them in the node's panel with a name and a type (Whole number, Decimal, Yes/No, Text, Position, Player, Entity, Item, Object, Identity). The name is what you write in the code. An unwired input arrives as a blank of its type (0, empty text, or nothing for a Player or Item) rather than as an error, so your code should expect that.

Names must be plain identifiers: letters, numbers and underscores, starting with a letter. Beyond Enforce's own keywords, a Custom Script pin also cannot be called player, victim, killer, attacker, identity, item, object or target — the generated event handlers already use those names, and a clash would not compile. The same name cannot be an input and an output either. The editor names the offender and asks you to rename it.

Example

A stamina drain scaled by carried weight, which no single node exposes. Add an input who of type Player and an output drained of type Decimal, wire the event's Player into who, and write the two or three lines that read the inventory weight and apply the drain, assigning the result to drained at the end. Downstream, Greater Than (drained > 50) into Branch sends heavy carriers down their own path.

The node title is editable, so rename it to what it does ("Drain by weight") rather than leaving every one of them called Custom Script.

Watch out

  • Your code is inserted exactly as typed. A missing semicolon, a wrong class

name, a method that does not exist — none of it is caught by NodeZ, and the build fails at the DayZ compiler with an error pointing into generated code. Keep each Custom Script node to a few lines so a failure is easy to place.

  • Assign every output before your code ends. An output you never set comes back

as a blank, silently.

  • It runs on the server. Client-only work — anything the hud* nodes do — does

not belong here; send a message with Send Client Message and handle it under On Client Message instead.

  • The pins are the only way in and out. Reaching for variables from surrounding

nodes by guessing their names will not work; wire what you need into a pin.

  • Enforce Script has no ? : shorthand. Write full if / else blocks, or

the mod will not compile.

Node Inputs

eventservercustom.nodeEntry

Where your custom node starts. Each pin you add here becomes an input on the node when it is placed in another graph. A custom node graph has exactly one of these. It is created for you with the graph.

Outputs
(exec)exec

The starting point of a custom node. Every graph you create with New Custom Node gets exactly one of these, already placed for you — it is where the chain begins when the custom node runs.

It is also where you declare what the node takes in. Each pin you add on the Node Inputs panel appears as an *output* here — values flowing into the graph, so they leave this node and travel into your wiring — and as an *input* on Custom Node wherever the custom node is placed. Name and type each pin once, and every placement in the project picks up the change.

When to use it

You do not place it; it comes with the graph. Open it to add, rename, retype or remove the custom node's inputs. Values the node produces are declared on Node Outputs instead.

Pins

The exec pin starts the body of the custom node. Wire it to the first thing that should happen.

Your declared pins carry the caller's values. Pick the type that matches what you want wired in — Player, Item, Position, Whole number, Text, Yes/No. Names should read like labels on the placed node (winner, radius, reason), because that is exactly what they become. They must be plain names: letters, numbers and underscores, starting with a letter.

An unwired input at a call site is not an error. It arrives as a blank of its type — 0, empty text, or nothing at all for a Player or Item — so decide inside the graph what an empty one means, usually with Is Valid and a Branch.

Example

A "warn everyone near a spot" custom node. Node Inputs declares spot (Position), radius (Decimal) and line (Text). The chain runs Node InputsFor Each Player Near (Position wired from spot, Radius from radius), and on its Body path Is Player AliveBranchSend Notification with line as the detail, aimed at the loop's Player. Place it under On Server Started, under a timer, under anything — each placement supplies its own spot, radius and wording.

Watch out

  • A custom node graph must have exactly one Node Inputs, and it only belongs

inside a custom node graph. Adding a second, or dropping one into a normal graph, is rejected with a clear message.

  • Game events cannot live inside a custom node. This is the only event-shaped

node allowed there; put On Player Died and friends in a normal graph and call the custom node from them.

  • Renaming a pin here renames it everywhere the node is placed, and deleting one

drops the wires that fed it. Rename deliberately.

  • Certain names are refused because they would collide with Enforce's own

keywords (class, return, int, null and the like). The editor tells you which; pick another word.

Node Outputs

actionservercustom.nodeExit

Where your custom node ends. Each pin you add here becomes an output on the node, carrying the value wired into it. Optional: leave it unwired (or delete it) if your custom node returns nothing. Set every output before any Delay node.

The finishing line of a custom node, and where it hands values back. Each pin you add on the Node Outputs panel appears as an *input* here — you wire the value into it — and as an *output* on Custom Node wherever the custom node is placed.

Reaching this node ends that chain inside the custom node; the caller then carries on from the placed node's exec pin with whatever you wired in.

When to use it

Only when your custom node produces something: a total, a found item, a yes/no answer. A custom node that just *does* things — hands out a kit, logs a line, warns an area — needs no outputs at all, and you can leave this node unwired or delete it. Inputs are declared on Node Inputs.

Pins

Your declared pins are the outputs, in the order you added them. Names become the labels on the placed node, so write them as labels (total, found, succeeded). An output you never wire comes back as a blank of its type: 0, empty text, or nothing for a Player or Item.

Note that the values are read at the moment the chain reaches this node. A branch that ends somewhere else never sets them, so the caller sees the blanks — if every path should produce a value, every path has to end here.

Example

A "pick a random spawn point" custom node. Node Inputs declares nothing; the body runs Random Config Position (from a config list of spawn points) → Snap To GroundNode Outputs with the result wired into a spot (Position) pin. Anywhere you place that custom node you get a Spot output ready to feed Teleport Player or Spawn Item.

Watch out

  • Set the outputs before any Delay in the custom node. The output

values live in the calling chain, so a value assigned after a wait would arrive long after the caller had moved on; the generator refuses to build that and tells you to move the delay after Node Outputs.

  • A custom node graph can have at most one Node Outputs, and it only belongs

inside a custom node graph. A copy in a normal graph is rejected.

  • Adding, renaming or removing a pin here changes every placement of the node

across the project, and removing one drops the wires that read it.

output is settled here once, and every use of that output at the call site sees the same roll. That makes a custom node a tidy way to pin down a roll that would otherwise re-roll at each place it is read.

Override Method (Advanced)

eventserverevent.overrideMethod

Advanced: override any class method — vanilla or from another mod — and run your flow when it is called. The class name, method name, parameters and return type must EXACTLY match the real method — NodeZ cannot check them, and a mismatch will not compile. Methods that return a value pass the original result through unchanged. Original method: "first" runs the original then your flow, "last" runs your flow then the original, "replace" skips the original (methods that return nothing only).

Outputs
(exec)exec
Settings
Target classtextrequired
Method to overridetextrequired
Returnstext
Original methodselect · first | last | replace · default "first"
Script moduleselect · 3_Game | 4_World | 5_Mission · default "4_World"

The event node for hooks NodeZ does not ship. Every other event in the library rides a hook that has been checked against vanilla source; this one lets you name *any* class and *any* method — vanilla, or one belonging to another mod — and run your flow whenever the game calls it. NodeZ builds the Enforce modded class around it for you.

That power comes with one hard condition: the class name, the method name, its parameters and its return type must match the real method exactly. NodeZ cannot look them up, so it cannot warn you — get one wrong and the mod does not compile. Have the real signature in front of you before you fill this node in.

The method's parameters are the node's output pins: add one pin per parameter, in the same order, with the matching type, and those pins carry the values the game passed in. Nothing else is exposed — not even the object the method was called on — so pick a method whose parameters already contain what you need. Methods that return something are pass-through: the original runs, its result is handed back untouched, and your flow is a side effect. You cannot change what the method returns.

When to use it

When something you need has no event node — reacting to a vehicle collision, to another mod's custom action, to a class NodeZ does not cover. If a normal event node fits, use it: On Player Died, On Player Took Damage, On Creature Killed and the rest are verified against real signatures and cost you nothing. To run a few lines of Enforce inside an existing chain rather than to hook a method, use Custom Script.

Pins

Target class — the exact class to extend, such as CarScript. Letters, numbers and underscores only.

Method to override — the exact method name, such as EEKilled. Case matters.

Returns — the method's return type (bool, int, float, string, vector, or a class name). Leave it empty for methods that return nothing.

Original method — where the game's own version runs. *First* runs it and then your flow (the safe default). *Last* runs your flow first, then the original. *Replace* skips the original entirely, and is only allowed for methods that return nothing.

Script module — which part of the mod the generated class lives in. 4_World suits gameplay classes and is the default; 5_Mission for mission classes, 3_Game for the lowest-level ones. Every override of the same class must agree on this.

Your parameter pins — one per parameter of the real method, in order, carrying its values into your flow.

Example

Logging who destroys vehicles, which has no node of its own. Target class CarScript, Method EEKilled, Returns left empty, Original method *first*, module 4_World, and one output pin named killer of type Object — because that is the single parameter the real method takes. From the exec pin, Cast To Player on killer → its Is Player path → Get Player NameJoin Text ("vehicle destroyed by " + name) → Log Message.

Watch out

  • A wrong class, method, parameter list or return type means the build fails at

the DayZ compiler, not in the editor. NodeZ checks only what it can: that the names look like real identifiers, and that *Replace* is not used on a method that returns a value.

  • Two nodes aimed at the same method must declare identical parameters, return

type and Original-method setting, and two aimed at the same class must use the same script module — one class becomes one generated file. A disagreement is reported as an error rather than guessed at.

  • *Replace* means the original never runs. Anything vanilla or another mod did

in that method stops happening, often in ways that surface much later.

  • Unlike the built-in events, this one adds no server-side guard. Your flow runs

wherever the game calls that method, which for a class that exists on both sides includes every player's machine. Target a class that only lives on the server, or gate the chain with a Custom Script node whose Yes/No output says whether this is the server, wired into Branch.

  • Another mod can override the same method. Enforce chains them through the

original call, so both run, in mod load order — which makes *Replace* a poor neighbour, since it cuts the chain. Test with the mod list you actually run.

Nothing matches. Try fewer words — search covers names, ids and keywords.