Загрузка данных


-- СКРИПТ ГЕНЕРАТОР КАРТЫ "ПАРАЗИТ" v2
-- Вставь в ServerScriptService → Script → MapBuilder

local workspace = game.Workspace

-- Цвета
local C = {
    baseplate = Color3.fromRGB(99, 95, 98),
    wall = Color3.fromRGB(163, 162, 165),
    red = Color3.fromRGB(196, 40, 28),
    blue = Color3.fromRGB(13, 105, 172),
    green = Color3.fromRGB(75, 151, 75),
    brown = Color3.fromRGB(124, 92, 70),
    grey = Color3.fromRGB(163, 162, 165),
    yellow = Color3.fromRGB(245, 205, 48),
    ceiling = Color3.fromRGB(27, 42, 53),
    floor = Color3.fromRGB(150, 150, 150),
    corridor = Color3.fromRGB(120, 120, 120),
    side = Color3.fromRGB(80, 80, 80),
    spawnGreen = Color3.fromRGB(75, 151, 75),
    spawnRed = Color3.fromRGB(196, 40, 28),
    spawnBlue = Color3.fromRGB(13, 105, 172),
    spawnYellow = Color3.fromRGB(245, 205, 48)
}

-- Утилита создания Part
function part(name, size, pos, color, parent, anchored)
    local p = Instance.new("Part")
    p.Name = name
    p.Size = size
    p.Position = pos
    p.Color = color
    p.Material = Enum.Material.Plastic
    p.Anchored = anchored ~= false
    p.TopSurface = Enum.SurfaceType.Studs
    p.BottomSurface = Enum.SurfaceType.Inlet
    p.Parent = parent
    return p
end

function wall(name, size, pos, color, parent)
    local w = part(name, size, pos, color, parent)
    w.TopSurface = Enum.SurfaceType.Smooth
    w.BottomSurface = Enum.SurfaceType.Smooth
    w.LeftSurface = Enum.SurfaceType.Studs
    w.RightSurface = Enum.SurfaceType.Studs
    return w
end

-- Создаём/находим папки
local map = workspace:FindFirstChild("Map")
if not map then
    map = Instance.new("Folder")
    map.Name = "Map"
    map.Parent = workspace
end

local npcs = workspace:FindFirstChild("NPCs")
if not npcs then
    npcs = Instance.new("Folder")
    npcs.Name = "NPCs"
    npcs.Parent = workspace
end

local spawns = workspace:FindFirstChild("Spawns")
if not spawns then
    spawns = Instance.new("Folder")
    spawns.Name = "Spawns"
    spawns.Parent = workspace
end

-- Удаляем ТОЛЬКО то что мы сами генерировали раньше (по имени)
local toDelete = {"Corridor", "SideRoom", "Ceiling", "CorridorTo", "Door"}
for _, child in pairs(map:GetChildren()) do
    local shouldDelete = false
    for _, prefix in pairs(toDelete) do
        if child.Name:sub(1, #prefix) == prefix then
            shouldDelete = true
            break
        end
    end
    if shouldDelete then
        child:Destroy()
    end
end

for _, child in pairs(npcs:GetChildren()) do
    child:Destroy()
end
for _, child in pairs(spawns:GetChildren()) do
    child:Destroy()
end

-- ПОТОЛОК (только если нет)
if not map:FindFirstChild("Ceiling") then
    part("Ceiling", Vector3.new(512, 1, 512), Vector3.new(0, 20, 0), C.ceiling, map)
end

-- КОРИДОРЫ (5 штук)
local corridorData = {
    {name = "Corridor1", x = -120},
    {name = "Corridor2", x = -60},
    {name = "Corridor3", x = 0},
    {name = "Corridor4", x = 60},
    {name = "Corridor5", x = 120}
}

for _, data in pairs(corridorData) do
    local folder = Instance.new("Folder")
    folder.Name = data.name
    folder.Parent = map
    
    -- Пол коридора
    part("Floor", Vector3.new(20, 1, 10), Vector3.new(data.x, 0, 0), C.corridor, folder)
    
    -- Стены коридора
    wall("WallNorth", Vector3.new(20, 20, 1), Vector3.new(data.x, 10, -5.5), C.wall, folder)
    wall("WallSouth", Vector3.new(20, 20, 1), Vector3.new(data.x, 10, 5.5), C.wall, folder)
end

-- ДВЕРНЫЕ ПРОЁМЫ (добавляем в твои комнаты)
local doorData = {
    {room = "Room1", side = "Right", x = -130.5, z = 0, color = C.red},
    {room = "Room2", side = "Left", x = -110.5, z = 0, color = C.blue},
    {room = "Room2", side = "Right", x = -69.5, z = 0, color = C.blue},
    {room = "Room3", side = "Left", x = -50.5, z = 0, color = C.green},
    {room = "Room3", side = "Right", x = -9.5, z = 0, color = C.green},
    {room = "Room4", side = "Left", x = 9.5, z = 0, color = C.brown},
    {room = "Room4", side = "Right", x = 50.5, z = 0, color = C.brown},
    {room = "Room5", side = "Left", x = 69.5, z = 0, color = C.grey},
    {room = "Room5", side = "Right", x = 110.5, z = 0, color = C.grey},
    {room = "Room6", side = "Left", x = 129.5, z = 0, color = C.yellow}
}

for _, data in pairs(doorData) do
    local room = workspace:FindFirstChild(data.room)
    if room then
        -- Удаляем старую дверь если есть
        local oldDoor = room:FindFirstChild("Door" .. data.side)
        if oldDoor then oldDoor:Destroy() end
        
        -- Ищем старую сплошную стену
        local wallName = "Wall" .. data.side
        local oldWall = room:FindFirstChild(wallName)
        
        -- Проверяем, сплошная ли она (высота 20 = сплошная, 8 или 12 = уже дверь)
        if oldWall and oldWall.Size.Y > 15 then
            oldWall:Destroy()
        end
        
        -- Создаём дверной проём: 3 части
        local doorFolder = Instance.new("Folder")
        doorFolder.Name = "Door" .. data.side
        doorFolder.Parent = room
        
        -- Верхняя часть (над дверью)
        wall("Top", Vector3.new(1, 8, 40), Vector3.new(data.x, 16, data.z), data.color, doorFolder)
        
        -- Левая боковина
        wall("SideLeft", Vector3.new(1, 12, 16), Vector3.new(data.x, 6, data.z - 12), data.color, doorFolder)
        
        -- Правая боковина
        wall("SideRight", Vector3.new(1, 12, 16), Vector3.new(data.x, 6, data.z + 12), data.color, doorFolder)
    else
        warn("Комната не найдена: " .. data.room)
    end
end

-- Room6 правая СПЛОШНАЯ стена (без двери!)
local room6 = workspace:FindFirstChild("Room6")
if room6 then
    -- Удаляем старую дверь если есть
    local oldDoor = room6:FindFirstChild("DoorRight")
    if oldDoor then oldDoor:Destroy() end
    
    -- Проверяем, нет ли уже сплошной
    if not room6:FindFirstChild("WallRightSolid") then
        wall("WallRightSolid", Vector3.new(1, 20, 40), Vector3.new(170.5, 10, 0), C.yellow, room6)
    end
end

-- БОКОВЫЕ КОМНАТЫ (3 штуки)

-- Боковая А: кладовая, сверху от Room1, Z=-50
if not map:FindFirstChild("SideRoomA") then
    local sideA = Instance.new("Folder")
    sideA.Name = "SideRoomA"
    sideA.Parent = map

    wall("Back", Vector3.new(25, 20, 1), Vector3.new(-150, 10, -62.5), C.side, sideA)
    wall("Front", Vector3.new(25, 20, 1), Vector3.new(-150, 10, -37.5), C.side, sideA)
    wall("Left", Vector3.new(1, 20, 25), Vector3.new(-162.5, 10, -50), C.side, sideA)
    wall("Right", Vector3.new(1, 20, 25), Vector3.new(-137.5, 10, -50), C.side, sideA)
    part("Floor", Vector3.new(23, 1, 23), Vector3.new(-150, 0, -50), C.floor, sideA)

    -- Коридор к боковой А
    local corrA = Instance.new("Folder")
    corrA.Name = "CorridorToA"
    corrA.Parent = map
    part("Floor", Vector3.new(8, 1, 20), Vector3.new(-150, 0, -28.75), C.corridor, corrA)
    wall("WallWest", Vector3.new(1, 20, 20), Vector3.new(-154.5, 10, -28.75), C.side, corrA)
    wall("WallEast", Vector3.new(1, 20, 20), Vector3.new(-145.5, 10, -28.75), C.side, corrA)
end

-- Боковая Б: техническая, снизу от Room4, Z=50
if not map:FindFirstChild("SideRoomB") then
    local sideB = Instance.new("Folder")
    sideB.Name = "SideRoomB"
    sideB.Parent = map

    wall("Back", Vector3.new(25, 20, 1), Vector3.new(30, 10, 37.5), C.side, sideB)
    wall("Front", Vector3.new(25, 20, 1), Vector3.new(30, 10, 62.5), C.side, sideB)
    wall("Left", Vector3.new(1, 20, 25), Vector3.new(17.5, 10, 50), C.side, sideB)
    wall("Right", Vector3.new(1, 20, 25), Vector3.new(42.5, 10, 50), C.side, sideB)
    part("Floor", Vector3.new(23, 1, 23), Vector3.new(30, 0, 50), C.floor, sideB)

    -- Коридор к боковой Б
    local corrB = Instance.new("Folder")
    corrB.Name = "CorridorToB"
    corrB.Parent = map
    part("Floor", Vector3.new(8, 1, 20), Vector3.new(30, 0, 28.75), C.corridor, corrB)
    wall("WallWest", Vector3.new(1, 20, 20), Vector3.new(25.5, 10, 28.75), C.side, corrB)
    wall("WallEast", Vector3.new(1, 20, 20), Vector3.new(34.5, 10, 28.75), C.side, corrB)
end

-- Боковая В: секретная, сверху от Room2, Z=-50
if not map:FindFirstChild("SideRoomC") then
    local sideC = Instance.new("Folder")
    sideC.Name = "SideRoomC"
    sideC.Parent = map

    wall("Back", Vector3.new(25, 20, 1), Vector3.new(-90, 10, -62.5), C.side, sideC)
    wall("Front", Vector3.new(25, 20, 1), Vector3.new(-90, 10, -37.5), C.side, sideC)
    wall("Left", Vector3.new(1, 20, 25), Vector3.new(-102.5, 10, -50), C.side, sideC)
    wall("Right", Vector3.new(1, 20, 25), Vector3.new(-77.5, 10, -50), C.side, sideC)
    part("Floor", Vector3.new(23, 1, 23), Vector3.new(-90, 0, -50), C.floor, sideC)

    -- Коридор к боковой В
    local corrC = Instance.new("Folder")
    corrC.Name = "CorridorToC"
    corrC.Parent = map
    part("Floor", Vector3.new(8, 1, 20), Vector3.new(-90, 0, -28.75), C.corridor, corrC)
    wall("WallWest", Vector3.new(1, 20, 20), Vector3.new(-94.5, 10, -28.75), C.side, corrC)
    wall("WallEast", Vector3.new(1, 20, 20), Vector3.new(-85.5, 10, -28.75), C.side, corrC)
end

-- СПАВНЫ (4 штуки, внизу слева)
local spawnData = {
    {name = "SpawnGreen", pos = Vector3.new(-180, 1, 80), color = C.spawnGreen},
    {name = "SpawnRed", pos = Vector3.new(-160, 1, 80), color = C.spawnRed},
    {name = "SpawnBlue", pos = Vector3.new(-180, 1, 100), color = C.spawnBlue},
    {name = "SpawnYellow", pos = Vector3.new(-160, 1, 100), color = C.spawnYellow}
}

for _, data in pairs(spawnData) do
    local spawn = Instance.new("SpawnLocation")
    spawn.Name = data.name
    spawn.Size = Vector3.new(6, 1, 6)
    spawn.Position = data.pos
    spawn.Color = data.color
    spawn.Material = Enum.Material.Plastic
    spawn.TopSurface = Enum.SurfaceType.Studs
    spawn.BottomSurface = Enum.SurfaceType.Inlet
    spawn.Parent = spawns
end

-- ТОЧКИ ДЛЯ NPC (патрульные маршруты)
local npcPoints = {
    {room = "Room1", center = Vector3.new(-150, 0.5, 0)},
    {room = "Room2", center = Vector3.new(-90, 0.5, 0)},
    {room = "Room3", center = Vector3.new(-30, 0.5, 0)},
    {room = "Room4", center = Vector3.new(30, 0.5, 0)},
    {room = "Room5", center = Vector3.new(90, 0.5, 0)},
    {room = "Room6", center = Vector3.new(150, 0.5, 0)},
    {room = "SideRoomA", center = Vector3.new(-150, 0.5, -50)},
    {room = "SideRoomB", center = Vector3.new(30, 0.5, 50)},
    {room = "SideRoomC", center = Vector3.new(-90, 0.5, -50)}
}

for _, data in pairs(npcPoints) do
    local folder = Instance.new("Folder")
    folder.Name = data.room .. "_Points"
    folder.Parent = npcs
    
    for i = 1, 3 do
        local point = Instance.new("Part")
        point.Name = "Point" .. i
        point.Size = Vector3.new(1, 1, 1)
        point.Position = data.center + Vector3.new(
            math.random(-12, 12),
            0,
            math.random(-12, 12)
        )
        point.Transparency = 1
        point.CanCollide = false
        point.Anchored = true
        point.Parent = folder
    end
end

-- Включаем шипы на всех горизонтальных поверхностях
for _, part in pairs(map:GetDescendants()) do
    if part:IsA("BasePart") and (part.Name == "Floor" or part.Name == "Baseplate") then
        part.TopSurface = Enum.SurfaceType.Studs
    end
end

print("=== КАРТА ПОСТРОЕНА ===")
print("Комнат: 6 основных + 3 боковых")
print("Коридоров: 5 + 3")
print("Спавнов: 4")
print("NPC точек: 9 комнат × 3 = 27")