Roblox · Дополнительное
Цилиндр-подставка, над ним крутится и покачивается оружие. Подходишь — «Взять» (E) — оружие в инвентаре, цилиндр краснеет на 60 секунд, витрина пропадает; потом всё возвращается. Выдаёт любой Tool: оружие, аптечку, энергетик.
Синим — что нужно создать.
ServerStorage └─ Pistol (Tool) — любой готовый Tool, который будем выдавать Workspace └─ WeaponSpawner (Model) ├─ Pad (Part) — Shape Cylinder, Orientation 0, 0, 90, Anchored │ └─ ProximityPrompt (ProximityPrompt) — HoldDuration 0.3, MaxActivationDistance 8 ├─ Configuration (Configuration) │ ├─ Tool (ObjectValue) — Value → ServerStorage.Pistol │ ├─ Cooldown (NumberValue) — секунд перезарядки, 60 │ └─ Height (NumberValue) — высота витрины, 3 ├─ SpawnerServer (Script) └─ Display (Model) — витрину создаёт скрипт сам: копии всех деталей предмета
Где: Workspace → WeaponSpawner · Script
Зачем: Крутит витрину, выдаёт предмет по ProximityPrompt и ставит спаунер на перезарядку.
-- модель спаунера
local spawner = script.Parent
-- цилиндр-подставка
local pad = spawner:WaitForChild("Pad")
-- надпись «Взять» — появляется, когда подходишь
local prompt = pad:WaitForChild("ProximityPrompt")
-- настройки
local config = spawner:WaitForChild("Configuration")
-- события каждого кадра
local RunService = game:GetService("RunService")
-- что выдаём: Tool из ServerStorage
local tool = config.Tool.Value
-- в Configuration → Tool ничего не выбрано
if not tool then
-- подсказка в Output
warn("Спаунер: выбери Tool в Configuration")
-- дальше не работаем
return
-- конец проверки
end
-- исходный цвет цилиндра
local readyColor = pad.Color
-- можно брать?
local ready = true
-- угол поворота витрины
local angle = 0
-- текст на кнопке
prompt.ActionText = "Взять"
-- что берём
prompt.ObjectText = tool.Name
-- витрина — модель: соберём её из копий всех деталей предмета
local display = Instance.new("Model")
-- имя
display.Name = "Display"
-- всё, что внутри предмета
for _, part in pairs(tool:GetDescendants()) do
-- только детали: Handle, ствол, магазин, прицел…
if part:IsA("BasePart") then
-- копия детали вместе с её видом (меш, текстура)
local copy = part:Clone()
-- что лежит внутри копии
for _, child in pairs(copy:GetDescendants()) do
-- скрипты, звуки и сварки витрине не нужны
if child:IsA("BaseScript") or child:IsA("Sound") or child:IsA("JointInstance") or child:IsA("WeldConstraint") then
-- убираем
child:Destroy()
-- конец проверки
end
-- конец перебора
end
-- висит в воздухе
copy.Anchored = true
-- сквозь неё можно пройти
copy.CanCollide = false
-- не срабатывает на касания
copy.CanTouch = false
-- в модель витрины
copy.Parent = display
-- конец проверки
end
-- конец перебора
end
-- центр вращения — рукоять (нет рукояти — центр модели)
display.PrimaryPart = display:FindFirstChild("Handle")
-- показываем
display.Parent = spawner
-- каждый кадр
RunService.Heartbeat:Connect(function(dt)
-- 90 градусов в секунду
angle += dt * 90
-- плавно качается вверх-вниз
local float = math.sin(os.clock() * 2) * 0.3
-- над цилиндром на высоте Height
local position = pad.Position + Vector3.new(0, config.Height.Value + float, 0)
-- двигаем всю модель сразу: детали не разъезжаются
display:PivotTo(CFrame.new(position) * CFrame.Angles(0, math.rad(angle), 0))
-- конец обработчика
end)
-- игрок нажал «Взять»
prompt.Triggered:Connect(function(player)
-- спаунер на перезарядке
if not ready then return end
-- инвентарь игрока
local backpack = player:FindFirstChild("Backpack")
-- инвентаря нет
if not backpack then return end
-- персонаж — предмет может быть в руках
local character = player.Character
-- такой предмет уже есть
if backpack:FindFirstChild(tool.Name) or (character and character:FindFirstChild(tool.Name)) then
-- второй не даём
return
-- конец проверки
end
-- спаунер занят
ready = false
-- копию предмета — в инвентарь
tool:Clone().Parent = backpack
-- цилиндр красный
pad.Color = Color3.fromRGB(200, 40, 40)
-- витрина пропала — убираем всю модель целиком
display.Parent = nil
-- кнопка «Взять» пропала
prompt.Enabled = false
-- ждём Cooldown секунд
task.wait(config.Cooldown.Value)
-- исходный цвет
pad.Color = readyColor
-- витрина снова видна
display.Parent = spawner
-- снова можно брать
prompt.Enabled = true
-- готов
ready = true
-- конец обработчика
end)Запусти Play (или Run) и убедись: