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