🚪 Door og Security System

I dag lager vi en dør-terminal der spilleren må skrive inn riktig passord for å åpne (eller lukke) dører. Vi bygger hele systemet: dører i verden + UI + kode.

TextBox TextButton Folder Attributes Dictionary UI-script

🎯 Mål for dette systemet

  • Bygge en dør i Workspace som kan åpnes og lukkes med kode.
  • Organisere dørene i en Folder (klar for mange dører).
  • Lage en terminal i UI (TextBox + knapp).
  • Koble passord → riktig dør med en dictionary (tabell).
  • Legge inn maks antall forsøk før systemet låser seg.
Resultat: Et fleksibelt passordsystem der du kan legge til så mange dører du vil, bare ved å utvide tabellen i koden.

📦 Komplett oppsett – Oversikt

Før vi bygger alt steg for steg, ser vi på den ferdige strukturen:

Workspace └─ Doors (Folder) ├─ Door1 (Part) ├─ Door2 (Part) └─ BossDoor (Part) StarterGui └─ DoorTerminalGui (ScreenGui) └─ TerminalFrame (Frame) ├─ TitleLabel (TextLabel) ├─ DoorText (TextBox) └─ SubmitButton (TextButton) └─ LocalScript (passord-kode)
Enkelt forklart: Spilleren skriver inn et passord i DoorText, trykker på knappen, og LocalScriptet sjekker om passordet matcher en av dørene i Doors-folderen.

🧱 Del 1: Lag dørene i Workspace

Vi starter med å lage dørene fysisk i verden.

1 Lag en Doors-folder

  1. Åpne Workspace i Explorer.

    Høyreklikk Workspace → Insert Object → Folder

    Navn: Doors

  2. Dette gjør det lett å ha mange dører samlet ett sted.

2 Lag selve dørene (Parts)

  1. Høyreklikk på Doors-folderen → Insert Object → Part.

    Navn: Door1

    Anchored: true (døren skal stå stille)

    CanCollide: true (blokkere spilleren)

    Size: f.eks. 6, 12, 1 (en høy dør)

    Material: Concrete / Metal / Wood

    Color: velg en farge (f.eks. rød)

  2. Du kan lage flere dører på samme måte:

    Door2 – kanskje blå dør

    BossDoor – stor og skummel dør

  3. Plasser dørene i level/designet ditt slik at de virkelig sperrer veien.
Når vi åpner en dør i koden, gjør vi den gjennomsiktig og skrur av CanCollide. Da kan spilleren gå gjennom.

🧱 Del 2: Lag passord-terminalen (UI)

Nå lager vi et lite panel på skjermen hvor spilleren kan skrive inn passordet.

3 Lag ScreenGui og Frame

  1. Åpne StarterGui i Explorer.

    Høyreklikk StarterGui → Insert Object → ScreenGui

    Navn: DoorTerminalGui

  2. Høyreklikk DoorTerminalGui → Insert Object → Frame.

    Navn: TerminalFrame

    Size: f.eks. {0, 300}, {0, 200}

    Position: f.eks. midt på skjermen eller i et hjørne

4 Legg til tekst og input

  1. Høyreklikk TerminalFrame → Insert Object → TextLabel.

    Navn: TitleLabel

    Text: "Dør-terminal"

  2. Høyreklikk TerminalFrame → Insert Object → TextBox.

    Navn: DoorText

    PlaceholderText: "Skriv passord..."

  3. Høyreklikk TerminalFrame → Insert Object → TextButton.

    Navn: SubmitButton

    Text: "Åpne dør"

🧱 Del 3: Koble knapp + TextBox til dørene (kode)

Nå legger vi inn et LocalScript under knappen som leser tekst fra DoorText og åpner riktig dør.

5 LocalScript under knappen

  1. Høyreklikk SubmitButton → Insert Object → LocalScript.
  2. Slett innholdet som står der, og lim inn koden under:
local button = script.Parent
local textBox = button.Parent:WaitForChild("DoorText")

-- Folder med alle dører
local doorsFolder = workspace:WaitForChild("Doors")

-- Koble passord til dører.
-- Du kan legge til SÅ MANGE du vil:
local doorsByPassword = {
    ["pass"] = doorsFolder:WaitForChild("Door1"),
    ["pass2"] = doorsFolder:WaitForChild("Door2"),
    ["boss"] = doorsFolder:WaitForChild("BossDoor"),
    -- Legg til flere:
    -- ["hemmelig"] = doorsFolder:WaitForChild("SecretDoor"),
}

local maxAttempts = 4
local attempts = 0
local locked = false

-- Hjelpefunksjoner for dørtilstand
local function ensureAttributes(door)
    if door:GetAttribute("Open") == nil then
        door:SetAttribute("Open", false)
    end
end

local function setDoorOpen(door, shouldOpen)
    if shouldOpen then
        door.Transparency = 0.7
        door.CanCollide = false
    else
        door.Transparency = 0
        door.CanCollide = true
    end
    door:SetAttribute("Open", shouldOpen)
end

local function toggleDoor(door)
    ensureAttributes(door)
    local isOpen = door:GetAttribute("Open")
    setDoorOpen(door, not isOpen)

    if not isOpen then
        print(("Døren '%s' er åpnet!"):format(door.Name))
    else
        print(("Døren '%s' er lukket!"):format(door.Name))
    end
end

button.MouseButton1Click:Connect(function()
    if locked then
        print("Låst. For mange forsøk.")
        return
    end

    local input = textBox.Text
    if input == nil or input == "" then
        print("Skriv inn et passord.")
        return
    end

    local chosenDoor = doorsByPassword[input]
    if chosenDoor then
        -- Riktig passord til en bestemt dør → toggle denne døren
        toggleDoor(chosenDoor)
    else
        -- Feil passord → øk forsøk
        attempts += 1
        print(("Feil passord, prøv igjen! Du har brukt %d forsøk."):format(attempts))

        if attempts >= maxAttempts then
            locked = true
            print("Dørsystemet er nå låst (for mange forsøk).")
        end
    end
end)
Du kan legge til nye dører ved å:
  1. Lage en ny dør (Part) i Doors-folderen.
  2. Gi den et navn, f.eks. YellowDoor.
  3. Legge til en linje i doorsByPassword: ["gul"] = doorsFolder:WaitForChild("YellowDoor").

🧠 Hva koden gjør (for elevene)

  • Spilleren skriver inn et passord i DoorText og trykker på SubmitButton.
  • Scriptet leser teksten og sjekker om den finnes i doorsByPassword-tabellen.
  • Hvis passordet finnes, finner vi riktig dør og åpner/lukker den (toggle).
  • Hvis passordet er feil, øker vi antall forsøk.
  • Etter for mange feil (4), blir systemet låst, og knappen gjør ingenting.

🔑 Viktige kodekonsepter

1. Variabler

local maxAttempts = 4
local attempts = 0
local locked = false

maxAttempts er hvor mange ganger spilleren kan prøve. attempts teller hvor mange feil de har gjort. locked sier om systemet er låst eller ikke.

2. Tabeller (dictionary / map)

local doorsByPassword = {
    ["pass"] = doorsFolder:WaitForChild("Door1"),
    ["pass2"] = doorsFolder:WaitForChild("Door2")
}

En tabell der nøkkelen er passord-tekst (f.eks. "pass"), og verdien er selve døren (Part) i Workspace. Når spilleren skriver noe, slår vi opp i tabellen:

local chosenDoor = doorsByPassword[input]

3. Funksjoner

local function toggleDoor(door)
    ...
end

Funksjoner er gjenbrukbare kodeblokker. toggleDoor tar inn en dør og bytter mellom åpen/lukket. Vi slipper å skrive samme kode flere ganger.

4. Attributes

door:SetAttribute("Open", shouldOpen)

Attributes er små verdier som lagres direkte på et objekt. Her bruker vi Open på døren for å huske om den er åpen eller lukket.

5. If-setninger

if locked then
    print("Låst.")
    return
end

If-setninger gjør at koden tar valg: "hvis dette er sant, gjør dette – ellers gjør noe annet".

6. Events

button.MouseButton1Click:Connect(function()
    ...
end)

Events kobler spillerens handlinger til kode. Her kjører funksjonen hver gang spilleren klikker knappen.

🧪 Mini-oppgaver

  • Legg til en ny dør YellowDoor med passord "gul".
  • Endre maxAttempts til 6.
  • Vis en TextLabel i terminalen som sier "Feil passord" ved feil.
  • Endre dørene til å bruke forskjellige farger når de åpnes.

🚀 Videreutvikling

  • Lag en "felle-dør" som åpner gulvet i stedet for selve døren.
  • Lag forskjellige nivåer med ulike passord.
  • Resett attempts etter 30 sekunder.
  • Lag et Leaderboard som teller hvor mange riktige passord spilleren har skrevet inn.

🛠️ Feilsøking

"Doors is not a valid member of Workspace"
Sjekk at du har laget en Folder som heter Doors inne i Workspace.
"Door1 is not a valid member of Doors"
Sjekk at døren heter nøyaktig Door1 (samme store/små bokstaver) og ligger inne i Doors-folderen.
Knappen gjør ingenting: Sjekk at LocalScript ligger under SubmitButton, ikke under Frame eller ScreenGui.
Systemet er alltid låst: Sjekk at du ikke har satt locked = true i starten.
🏠 Tilbake til Roblox Oversikt