AncientGatewayController.lua 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. local ReplicatedStorage = game:GetService("ReplicatedStorage")
  2. local CollectionService = game:GetService("CollectionService")
  3. local RunService = game:GetService("RunService")
  4. local Workspace = game:GetService("Workspace")
  5. local Players = game:GetService("Players")
  6. local LocalPlayer = Players.LocalPlayer
  7. local common = ReplicatedStorage.common
  8. local hitIsYou = require(common.util.hitIsYou)
  9. local ParticleCreator = require(common.ParticleCreator)
  10. local SoundHelper = require(common.SoundHelper)
  11. local root = script.Parent
  12. local telegroup = root.telegroup
  13. local keyslots = root.keyslots
  14. local keysInOrder = {
  15. keyslots.slots.Red,
  16. keyslots.slots.Green,
  17. keyslots.slots.Blue,
  18. }
  19. local isOpen = false
  20. local function destroyKeySlot(slot)
  21. coroutine.wrap(function()
  22. CollectionService:RemoveTag(slot, "floaty")
  23. ParticleCreator.Presets.explode(slot.CFrame)
  24. SoundHelper.playSoundAt(slot.CFrame, "magic")
  25. slot:Destroy()
  26. end)()
  27. end
  28. local function openPortal()
  29. if isOpen then return end
  30. isOpen = true
  31. local ts = game:GetService("TweenService")
  32. -- animate key slots exploding
  33. for _, slot in pairs(keysInOrder) do
  34. destroyKeySlot(slot)
  35. wait(0.3)
  36. end
  37. -- animate white sphere charging
  38. keyslots:Destroy()
  39. ParticleCreator.spawnParticle("vacuum", {
  40. cFrame = root.Portal.Part.CFrame,
  41. scale = root.Portal.Part.Size.Magnitude * 0.75,
  42. amount = 1,
  43. timeScale = 0.8,
  44. })
  45. SoundHelper.playSoundAt(root.Portal.Part.CFrame, "portal_open", {
  46. delay = 0.8
  47. })
  48. wait(1)
  49. SoundHelper.playSoundAt(root.Portal.Part.CFrame, "portal_loop")
  50. -- animate portal opening explosion
  51. root.Portal.Part.Mesh.Scale = Vector3.new(0,0,0)
  52. root.Portal.Part.Color = Color3.new(1,1,1)
  53. local OPENING_DURRATION = 0.4
  54. local FADE_DURRATION = 2
  55. local scaleTweenInfo = TweenInfo.new(OPENING_DURRATION, Enum.EasingStyle.Quint, Enum.EasingDirection.In)
  56. local colorTweenInfo = TweenInfo.new(FADE_DURRATION, Enum.EasingStyle.Quad, Enum.EasingDirection.InOut,0,false,1)
  57. ts:Create(root.Portal.Part.Mesh, scaleTweenInfo, {Scale = Vector3.new(1,1,1)}):Play()
  58. ts:Create(root.Portal.Part, colorTweenInfo, {Color = Color3.new(0,0,0)}):Play()
  59. wait(OPENING_DURRATION-0.1)
  60. CollectionService:AddTag(telegroup, "teleporter_group")
  61. SoundHelper.playSoundAt(root.Portal.Part.CFrame, "lightning")
  62. root.Portal.emitters.FullPart.Big:Emit(10)
  63. root.Portal.emitters.FullPart.Small:Emit(10)
  64. root.Portal.emitters.FullPart.Fast:Emit(100)
  65. root.Portal.emitters.HalfPart.VeryFast:Emit(20)
  66. root.Portal.emitters.FullPart.Big.Enabled = true
  67. root.Portal.emitters.FullPart.Small.Enabled = true
  68. end
  69. local function setupTeleportGroup()
  70. for k,v in pairs(telegroup:GetChildren()) do
  71. if v:IsA("BasePart") then
  72. v.Transparency = 1
  73. end
  74. end
  75. end
  76. return function(clientSession)
  77. local store = clientSession.store
  78. local api = clientSession.api
  79. root.Trigger.Touched:Connect(function(hit)
  80. if hitIsYou(hit) then
  81. local hasAllKeys = (
  82. clientSession:getGameFlag("hasRedKey") and
  83. clientSession:getGameFlag("hasGreenKey") and
  84. clientSession:getGameFlag("hasBlueKey")
  85. ) or RunService:IsStudio()
  86. if hasAllKeys then
  87. openPortal()
  88. end
  89. end
  90. end)
  91. root.Trigger.Transparency = 1
  92. setupTeleportGroup()
  93. end