Загрузка данных
-- СКРИПТ ГЕНЕРАТОР КАРТЫ "ПАРАЗИТ" 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")