One player's placement setup: configuration, catalog, and current state. Create one per player and register it with the GridPlacementHost. For split-screen, give each player their own session on the same host. var session := PlacementSession.new() session.grid_placement_bundle = preload("res://bundle.tres") var host := GridPlacementHost.new() host.configure(session) host.bind_scene_consumers(scene_root, session) # Additional players join the same host through register_session.
Source: addons/grid_placement/resources/placement_session.gd
Syntax
class PlacementSession extends ResourceMembers
| Name | Kind | Summary |
|---|---|---|
grid_placement_bundle | Property | The Grid Placement configuration this session uses. |
catalog | Property | The objects and terrains this player can place. Session-owned: the bundle carries no catalog, so an unset catalog means this session can place nothing. |
settings | Property | Override only. Game-wide config belongs in the bundle; use these only for per-player tweaks (e.g. split-screen input). Leave null to inherit from grid_placement_bundle.settings. |
actions | Property | Override only. Input actions for this session only, such as a second player's controls. Leave null to inherit from grid_placement_bundle.actions. |
states | Property | Shared states for plugin systems. |
contexts | Property | Context for resolving references to current objects. |
terrain_selected | Signal | Emitted when selected_terrain_name changes. The host uses it to switch to terrain painting when a terrain is picked. |
entry_selected | Signal | Emitted when selected_entry changes. |
coordinate_mode_changed | Signal | Emitted when placement_coordinate_mode changes. |
placement_coordinate_mode | Property | Coordinate mode for placement targeting. GRID (default) snaps to cell centers; SMOOTH uses exact world positions. Session-scoped, explicit — no heuristic auto-detection. Changing this clears any active preview and resets targeting state so grid and smooth state never bleed. |
selected_terrain_name | Property | Runtime terrain selection for this session (NOT serialized — transient per-player state). The terrain palette UI writes the user's pick here; GridPlacementHost reads it from the device-resolved active session when dispatching PLACE_SINGLE_TERRAIN / terrain-brush paint. Empty means no terrain is selected and terrain dispatch is a no-op. Keeping it on the session (the one object both the UI and the host already hold) is what lets split-screen sessions each carry their own selection. |
selected_terrain_entry | Property | Optional catalog metadata for the selected terrain. These transient fields keep terrain rule/cost validation session-owned without requiring the compatibility building system to mirror UI state. |
selected_terrain_palette | Property | |
selected_entry | Property | Runtime scene_entry selection for this session (NOT serialized — transient per-player state). The scene_entry UI writes the user's pick here; GridPlacementHost reads it from the device-resolved active session when dispatching PLACE_SINGLE_OBJECT / object-drag intents. Null means no scene_entry is selected and object dispatch is a no-op. Symmetric to selected_terrain_name — this is the object-mode counterpart that fixes the terrain/object cross-leak where a smithy pick drove fence placement. |
logger | Property | Returns this session's logger. Lazily initializes the shared production logger from this session's debug settings when no logger was injected. |
get_contexts | Method | |
get_states | Method | |
get_logger | Method | |
get_mode_state | Method | |
get_targeting_state | Method | |
get_building_state | Method | |
get_manipulation_state | Method | |
get_placement_rules | Method | |
set_placer_root | Method | |
get_placer_root | Method | |
placer_requirement | Method | |
get_placer_requiring_rule | Method | |
get_active_placer_rules | Method | |
fork_for_player | Method | |
bind_positioner_placer_root | Method | |
get_runtime_issues | Method | |
get_settings | Method | |
get_actions | Method | |
get_templates | Method | |
get_visual_settings | Method | |
get_manipulation_settings | Method | |
get_debug_settings | Method | |
get_runtime_checks | Method | |
get_indicator_context | Method | |
set_states | Method |