Скрипт: дверь по ключу и дверь с кнопкой

Серверный скрипт открывает дверь, если у игрока в инвентаре есть предмет-ключ, и закрывает её через несколько секунд. Решение принимает сервер — на клиенте дверь не открывается никак.

Куда положить

ServerScriptService, тип объекта Script

Что должно быть в проекте

  • В Workspace деталь с именем Door (Anchored включён)
  • Предмет-ключ в Backpack игрока с именем Key — его выдаёт другая механика игры

Код

ServerScriptService/Door.lua
  1. local door = workspace:WaitForChild("Door")
  2.  
  3. local OPEN_TIME = 4
  4. local KEY_NAME = "Key"
  5.  
  6. local isOpen = false
  7.  
  8. local function setOpen(open: boolean)
  9. isOpen = open
  10. door.CanCollide = not open
  11. door.Transparency = open and 0.7 or 0
  12. end
  13.  
  14. door.Touched:Connect(function(hit)
  15. if isOpen then
  16. return
  17. end
  18.  
  19. local character = hit.Parent
  20. local humanoid = character and character:FindFirstChildOfClass("Humanoid")
  21.  
  22. if not humanoid then
  23. return
  24. end
  25.  
  26. local player = game:GetService("Players"):GetPlayerFromCharacter(character)
  27.  
  28. if not player then
  29. return
  30. end
  31.  
  32. local backpack = player:FindFirstChild("Backpack")
  33. local hasKey = character:FindFirstChild(KEY_NAME)
  34. or (backpack and backpack:FindFirstChild(KEY_NAME))
  35.  
  36. if not hasKey then
  37. return
  38. end
  39.  
  40. setOpen(true)
  41. task.delay(OPEN_TIME, function()
  42. setOpen(false)
  43. end)
  44. end)

Проверка ключа идёт и в руках персонажа, и в рюкзаке — предмет может быть в любом из них.

На что обратить внимание

  • Имя ключа и время открытия вынесены в начало — их и меняют под свою игру
  • Для двери на петлях вместо прозрачности используй HingeConstraint
  • Touched срабатывает часто, поэтому первым делом стоит проверка isOpen