Kartik Scripts

Property Types, Shells, IPL & Walk-in

Property Types, Shells, IPL & Walk-in (MLO)

Every property is backed by one of three interior kinds. The kind you pick when creating a property decides how the interior is loaded, where furniture can go, and how doors work.

KindWhat it isInstanced?Doors
ShellAn instanced interior model spawned in the "underworld" (or just below the entrance)✅ Yes (routing bucket)Virtual entrance zone
IPLA real map interior (e.g. GTA apartments) activated for the player✅ YesVirtual entrance zone
Walk-in (MLO)An existing building/MLO in the world, claimed as a deed❌ No (real location, bucket 0)Real, physical door entities

Shells

A shell is an interior model that gets spawned on demand. Multiple owners never see each other because each property is placed in its own routing bucket (Config.BucketBase + property id).

  • Registered with KP.AddShell(id, def) in shared/shells.lua / shared/shells/**. A shell needs a model (or doorCoords), a label, and usually a doorOffset and price.
  • Spawned at Config.ShellAnchor (0,0,-200), or, with Config.RelativeShellSpawning = true: directly below the physical entrance (keeps voice chat and the minimap accurate).
  • Furniture may be placed within Config.EnvelopeRadius (120 m) of the shell origin, up to Config.ShellEnvelopeHeight (50 m) tall.
  • Example categories: residential, motel (see Motels), etc.
KP.AddShell('cozy_studio', {
    model = 'shell_apartment_v1',
    label = 'Cozy Studio',
    category = 'residential',
    doorOffset = vec4(0.0, -2.0, 0.0, 180.0),
    price = 25000,
})

Shell packs from other creators (e.g. K4MB1) are auto-registered when their resource is running, see shared/shells/k4mb1.lua for the pattern.

Finding a new shell's doorOffset

The doorOffset is a vec4(x, y, z, h), the shell-relative point where a player lands when entering (and where the exit prompt sits), plus the heading they face. Because shells spawn with no rotation, it's just the world offset from the shell origin to your standing spot; no rotation math is involved.

Rather than eyeballing coordinates, use the built-in offset teller command (admin only):

/kpp_shell <model | shellId>
  1. Pass a model name (e.g. /kpp_shell shell_apartment_v1) to start at the shell origin, or an existing shell id (e.g. /kpp_shell container) to spawn on its current doorOffset and fine-tune from there.

  2. The shell spawns underground below your own position (local-only, nobody else sees it) and you're dropped inside.

  3. A live HUD on the right side of the screen shows your current X / Y / Z offset and heading (H), updating as you walk.

  4. Walk to the front door, face the way you want players to spawn, then press ENTER: the ready-to-paste line is copied to your clipboard and printed to the F8 console:

    doorOffset = vec4(-0.042252, -5.402466, -0.213661, 1.775326),
  5. Press BACKSPACE to leave; you're returned exactly where you started.

Paste that line straight into your KP.AddShell / shells/*.lua entry.

/kpp_shell is a builder tool: it's admin-gated server-side (spoof-proof) and purely local, it spawns nothing on the live map and cleans itself up on exit.

IPL interiors

An IPL is a real GTA map interior that's streamed in (RequestIpl) and activated for the entering player. Like shells, IPL properties are instanced by routing bucket.

  • Registered with KP.AddInterior(id, def) where def.kind = 'ipl' in shared/interiors.lua / shared/interiors/**.
  • Needs an interior spawn point (interior / doorCoords).
  • Furniture envelope is Config.EnvelopeRadius around the interior point, half- extent Config.EnvelopeHeight (8 m).
  • IPL can be enabled/disabled per block (allow_ipl) and per mode (Config.Classic.AllowIpl).

kind = 'mlo' is no longer registered in config. To use an existing MLO, file it in-game as a walk-in instead (see below).

Walk-in (MLO) properties

A walk-in is an existing building or MLO in the live world, claimed as a deed. There is no instancing, the property sits at its real location in bucket 0, so anyone can walk in.

How a walk-in is created (creation wizard):

  1. Place the entrance where the door is.
  2. Draw the yard zone, the polygon (with a Z band) that defines "inside".
  3. Pick the real door entities so they can be locked.

Physical doorlocks. Walk-in doors use the native GTA door system, driven by the property's single locked flag on global state. Raids, lockpicks, key items and lock toggles all write that flag, and the doors follow.

  • Pick doors in the wizard, or retrofit later via radial → Property → Set Doors.
  • Double doors: pick both leaves.
  • Limits: Config.Doorlocks.MaxDoors (8), within Config.Doorlocks.MaxDoorDistance (60 m) of the entrance.
  • New deeds are born locked; Config.Doorlocks.Autolock (300 s) re-locks after any unlock.

Multi-room walk-in buildings: file each room as its own walk-in deed (own door + room-scoped yard zone with a per-floor Z band). Don't nest a whole-building zone over room zones, overlapping zones fight over the interior.

Enabling walk-ins in Classic mode requires Config.Classic.AllowWalkIn = true.


Furniture envelope summary

The envelope is the volume where furniture, stashes, wardrobes, cameras and sensors may be placed. It's enforced on both client and server:

  • Shell / IPL: a Config.EnvelopeRadius (120 m) radius around the interior point / shell anchor.
  • Walk-in: the drawn yard polygon plus its Z band.

See Furniture Modeler for placement.

On this page