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


-- СКРИПТ ГЕНЕРАТОР КАРТЫ "ПАРАЗИТ"
-- Вставь в 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") or Instance.new("Folder")
map.Name = "Map"
map.Parent = workspace

local npcs = workspace:FindFirstChild("NPCs") or Instance.new("Folder")
npcs.Name = "NPCs"
npcs.Parent = workspace

local spawns = workspace:FindFirstChild("Spawns") or Instance.new("Folder")
spawns.Name = "Spawns"
spawns.Parent = workspace

-- Удаляем только то что мы сами генерировали раньше
for _, child in pairs(map:GetChildren()) do
    if child.Name ~= "Room1" and child.Name ~= "Room2" and child.Name ~= "Room3" 
       and child.Name ~= "Room4" and child.Name ~= "Room5" and child.Name ~= "Room6" 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

-- ПОТОЛОК
part("Ceiling", Vector3.new(512, 1, 512), Vector3.new(0, 20, 0), C.ceiling, map)

-- КОРИДОРЫ (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 = {
    -- [имя комнаты] = {стена: "Left"/"Right", позиция двери}
    {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}
    -- Room6 правая стена СПЛОШНАЯ - без двери!
}

for _, data in pairs(doorData) do
    local room = workspace:WaitForChild(data.room)
    if room then
        -- Удаляем старую сплошную стену если есть
        local oldWall = room:FindFirstChild("WallRight") or room:FindFirstChild("WallLeft")
        if oldWall and (data.side == "Right" and oldWall.Name == "WallRight" or 
                        data.side == "Left" and oldWall.Name == "WallLeft") then
            -- Проверяем, не дверной ли это уже проём
            if oldWall.Size.Y > 15 then -- сплошная стена высотой 20
                oldWall:Destroy()
            end
        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)
    end
end

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

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

-- Боковая А: кладовая, сверху от Room1, Z=-50
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)

-- Коридор к боковой А (от Room1 вверх)
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)

-- Боковая Б: техническая, снизу от Room4, Z=50
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)

-- Коридор к боковой Б (от Room4 вниз)
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)

-- Боковая В: секретная, сверху от Room2, Z=-50
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)

-- Коридор к боковой В (от Room2 вверх)
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)

-- СПАВНЫ (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 = "SideA", center = Vector3.new(-150, 0.5, -50)},
    {room = "SideB", center = Vector3.new(30, 0.5, 50)},
    {room = "SideC", 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")