Персонажи самого сервера: продавцы, охранники, прохожие. npcs.create на сервере; все рядом видят одного и того же — он стоит, где поставили, играет свою анимацию, идёт, куда послали. Игра игроков им не управляет.
Магазин
-- сервер
local seller = npcs.create("VITPRA", 121.5, 846.0, -19.9, 3.14, { name = "Продавец" })
seller:playAnimation("sc_man_smoke_stat_a", true)
blips.attach(seller, { icon = 1, style = 9 })
events.onClient("buy", function(player, id)
local npc = npcs.get(id)
if not npc or (npc:getDistanceTo(player) or 99) > 3 then return end
npc:lookAt(player)
chat.send(player, "Держите")
end)
-- клиент
keys.on("E", function()
local id = npcs.getNearest(2)
if id then events.emitServer("buy", id) end
end)
Ходьба
local guard = npcs.create("VITPRA", 115, 840, -19.9, 0, { name = "Охранник" })
local points, i = { {115, 840, -19.9}, {125, 850, -19.9} }, 1
guard:walkTo(table.unpack(points[2]))
events.on("npcArrived", function(npc)
if npc.id ~= guard.id then return end
i = i % #points + 1
npc:walkTo(table.unpack(points[i]))
end)
Идут к точке по прямой ({ run = true } — бегом), поэтому за углы ведите их по нескольким точкам.
Лимиты
Каждому игроку показываются ближайшие 64 NPC по своему, отдельному лимиту: игроки (до maxStreamedPlayers сервера) и пешеходы трафика сохраняют свои. Модели персонажей: когда слотов игры не хватает, их получают сначала игроки, потом NPC, потом трафик; остальные на время в стандартном облике.
Скины — модели персонажей игры (страница «Модели персонажей»); dimension работает как у игроков.