Skip to main content

What Is Crafty?

Crafty is the autoload singleton exposed by the SDK. Use it for platform-level operations that are not tied to one player object.

Crafty vs Player Object

  • Use Crafty for match-wide actions (timer, announcements, spawning, subsystem access).
  • Use the player object (CraftyPlayer or CraftyCharacter3D) for per-player synced state and input.

Core Methods (Signatures)

end_game() -> void
set_time_limit(seconds: float) -> void
get_time_remaining() -> float
get_players() -> Array
get_player_count() -> int
get_max_players() -> int
send_announcement(text: String) -> void
spawn_npc(scene: PackedScene, position: Vector3) -> CraftyNPC
spawn_object(scene: PackedScene, position: Vector3) -> CraftyObject
spawn_projectile(scene: PackedScene, origin: Vector3, direction: Vector3, speed: float) -> CraftyObject
is_server() -> bool
is_client() -> bool

Match Flow

Crafty.set_time_limit(300)
Crafty.send_announcement("Round started")

if Crafty.get_time_remaining() <= 0.0:
    Crafty.end_game()

Players

var players = Crafty.get_players()
var current = Crafty.get_player_count()
var max_players = Crafty.get_max_players()

Announcements

Crafty.send_announcement("Sudden death starts now!")

Spawning

var npc = Crafty.spawn_npc(npc_scene, Vector3(0, 0, 0))
var pickup = Crafty.spawn_object(pickup_scene, Vector3(2, 0, 2))
var projectile = Crafty.spawn_projectile(bullet_scene, origin, direction, 30.0)

Runtime Context

if Crafty.is_server():
    # scoring, persistence, win conditions
    update_game_state()
Use is_server() and is_client() to keep gameplay authority on the server.

Subsystems

Crafty exposes optional subsystem handles:
  • Crafty.teams
  • Crafty.score
  • Crafty.data
  • Crafty.economy
  • Crafty.ui
  • Crafty.audio
  • Crafty.input
See /api-reference/crafty-sdk/subsystems-signals for subsystem APIs.