Skip to content

Carrying & Attach Points

How carrying works

When a player stows a lantern, the resource hands it to the game's own lantern attach point rather than spawning a fake prop.

That matters for three reasons:

  • it lights the world like a real lantern, because it is one
  • it survives weapon switches and holstering
  • that attach point is inside the engine's replicated range, so other players see it with no custom networking at all

If the engine ever refuses — it happens in a few interiors and scripted states — the resource falls back to a prop on the same bone and tells other clients to render it too. The player never loses their lantern either way.

On the player

Two positions, chosen automatically:

ProfileBoneAvailable on
satchelPH_LanternEvery ped model
gunbeltMH_L_BeltSideplayer_zero and player_three only

Most RedM servers will always get the satchel

MH_L_BeltSide is part of Arthur's and John's skeletons. It does not exist on mp_male / mp_female, so multiplayer peds use the satchel position. That is the game's limitation, not the resource's.

lua
Config.PedCarryStyle = 'auto'    -- gun belt if the ped has it, satchel if not
                     -- 'satchel'  always the satchel
                     -- 'gunbelt'  prefer the gun belt, satchel as fallback

On the horse

RDR2 has no saddle entity. The saddle is a metaped component skinned onto the horse's skeleton, so there is nothing to parent to — but the bones below are the saddle's own prop hooks, which means attaching to them is attaching to the saddle. The lantern moves with it and sits correctly whichever saddle the horse wears.

lua
Config.HorseAttachPoint = 'weightbag'
ValueBoneLook
weightbag (default)ES_L_WeightBag0Hanging off the left bag
saddlePH_saddle_attach_LOn the saddle's left prop hook
hornPH_SaddleHornFront of the saddle
rearPH_SaddleRearGripBehind the rider

weightbag is the default because it is the only one with measured offsets — they came from the original mod and look right out of the box. The other three start from the bare bone and may want a nudge.

A horse with no saddlebag

ES_L_WeightBag0 exists on the horse skeleton whether or not a saddlebag is equipped. On a bare-saddled horse the lantern hangs where the bag would be, with nothing behind it.

If your server has bare-saddled horses, saddle is the safer choice — that hook is part of the saddle itself, which every ridable horse has.

Dismounting

lua
Config.KeepLanternOnHorse = false

false — stepping down brings the lantern back to the rider. true — it stays hanging until they take it off.

Either way, if the horse dies or streams out while carrying, the lantern is returned to the player rather than lost with the horse.

Reaching it from the ground

lua
Config.HorseReachDistance = 3.5

How close a dismounted player must be to take the lantern off the saddle.

Tuning the position

Offsets live in the bone's local space, and every offset set belongs to one specific bone.

Do not move offsets between bones

Putting one profile's numbers on another profile's bone is what buries a lantern inside a horse. If you change a bone, re-tune the offsets.

Turn the tuning commands on:

lua
Config.TuningCommands = true

Then, with the lantern stowed:

/lanterntune            keep it on the horse when you dismount, so you can look
/lanternmove 0 -0.2 0   move it in horse terms: side, forward, up (metres)
/lanternspin 0 0 15     turn it (pitch, roll, yaw in degrees)
/lanternreset           undo everything, back to config.lua
/lanterntune off        finish

/lanternmove is the one to use. Nothing in the game files says which way a bone's local axes point, so the resource measures them: it attaches the prop a metre along each local axis, sees where it lands in the world, and solves for the offset that produces the movement you asked for.

  • side — positive to the horse's right
  • forward — positive toward its head
  • up — positive upward

Every command prints a ready-to-paste config.lua line:

[rm_Lantern] Config.HorseAttachPoints.saddle = { bones = {...}, pos = vector3(0.200, 0.000, 0.000), rot = vector3(0.00, 0.00, 0.00) },

Paste it in, restart, done.

/lanterntune matters more than it looks

With the default KeepLanternOnHorse = false, dismounting pulls the lantern back to the rider and deletes the saddle prop — so you cannot stand back and look at what you are tuning. /lanterntune pins it in place. The other tuning commands switch it on for you automatically.

Also available: /lanternbone <name> to try a different bone live, and /lanternpoint <saddle|weightbag|horn|rear> to switch attach point without a restart. /lanternaxis and /lanternnudge work in raw bone axes if you prefer that to /lanternmove.

Bone fallbacks

Each attach point lists several bones and uses the first one the model actually has:

lua
Config.HorseAttachPoints = {
    saddle    = { bones = { 'PH_saddle_attach_L', 'CP_L_Saddle' }, ... },
    weightbag = { bones = { 'ES_L_WeightBag0', 'ES_L_OpenBag0' }, ... },
}

Config.PedBones = {
    satchel = { 'PH_Lantern' },
    gunbelt = { 'MH_L_BeltSide', 'MH_L_BeltSide_JM_000' },
}

Only the first entry in each list matches the measured offsets. The rest exist so an unusual skeleton still gets something sensible, and will want their own tuning.

If no bone in the list is found, the resource refuses to attach rather than falling back to the entity centre — a lantern floating inside a horse is worse than no lantern. With Config.Debug = true you will see why in the console.

Documentation for RedMorrow. Scripts are licensed per server — redistribution is not permitted.