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.
| Kind | What it is | Instanced? | Doors |
|---|---|---|---|
| Shell | An instanced interior model spawned in the "underworld" (or just below the entrance) | ✅ Yes (routing bucket) | Virtual entrance zone |
| IPL | A real map interior (e.g. GTA apartments) activated for the player | ✅ Yes | Virtual 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)inshared/shells.lua/shared/shells/**. A shell needs amodel(ordoorCoords), alabel, and usually adoorOffsetandprice. - Spawned at
Config.ShellAnchor(0,0,-200), or, withConfig.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 toConfig.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>-
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 currentdoorOffsetand fine-tune from there. -
The shell spawns underground below your own position (local-only, nobody else sees it) and you're dropped inside.
-
A live HUD on the right side of the screen shows your current X / Y / Z offset and heading (H), updating as you walk.
-
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), -
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)wheredef.kind = 'ipl'inshared/interiors.lua/shared/interiors/**. - Needs an interior spawn point (
interior/doorCoords). - Furniture envelope is
Config.EnvelopeRadiusaround the interior point, half- extentConfig.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):
- Place the entrance where the door is.
- Draw the yard zone, the polygon (with a Z band) that defines "inside".
- 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), withinConfig.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.