githubEdit

Object Management

This page explains how object scripts are created, registered, managed, and destroyed dynamically on the client.

Utility Objectify includes a powerful system for managing object script instances tied to entities in the world.

When entities are spawned or unspawned, the framework dynamically creates or destroys script instances based on model-to-class mappings. This allows for automatic behavior assignment and modular logic.


🧠 How It Works

OnRender

When an entity becomes visible to the player:

  1. Its model is checked against registered scripts.

  2. A new instance of the class extending BaseEntity is created for each script (main and any plugins).

  3. Is added to the global 🧠 Entities Singleton list.

  4. Lifecycle methods (OnAwake, OnSpawn, AfterSpawn) are called.

  5. The instance is stored and tracked.

OnUnrender

When the entity is no longer visible:

This logic is handled via internal UtilityNet events:


📦 Temp Object Properties

Before the object is rendered, properties set during Hooks are stored in a temporary table:

These are stored and later injected to the real instance when the object is rendered. This ensures that Hooks can prepare data even before the object is visible, like creating a blip at the entity coords

can interact only with the temporary instance properties, not real instance runtime changed properties. have access only to:

Name
Description

self.id

The uNetId (UtilityNet id) of the current entity

self.state

The object state bag, read-only (client)

All other hooks (OnSpawn, OnDestroy, etc...)

can interact with the temporary instance properties, as they will be injected before the OnAwake hook


</> API Reference

IsObjectScriptRegistered(model, name)

Checks if a specific model as a script registered to im, can be useful if a plugin needs another plugin to work properly

RegisterCustomHook(hookMethod, hookData)

See 🪝 Custom Hook System

GetObjectScriptInstance(obj, name, nocheck?)

Fetch a specific script instance by name from an object. All main scripts are exposed as main

  • nocheck = true skips rendering checks.

GetExternalObjectScriptStatic(model, name)

Returns the raw script table (class) without creating an instance.

⚠️ This is unsafe for live operations, use for inspection only.

AreObjectScriptsFullyLoaded(obj)

Returns true if all scripts have been fully created and attached to the object.

Last updated