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


-- ЛАБОРАТОРИЯ ЧП v2 — ИСПРАВЛЕННАЯ
-- Улучшения: масштаб, двери, забор, детали

local C = {
    asphalt = Color3.fromRGB(99, 95, 98),
    grass = Color3.fromRGB(75, 151, 75),
    wall_white = Color3.fromRGB(245, 245, 245),  -- ярче
    wall_grey = Color3.fromRGB(140, 140, 140),   -- темнее
    roof = Color3.fromRGB(40, 40, 40),
    fence = Color3.fromRGB(80, 80, 80),
    door = Color3.fromRGB(100, 70, 50),          -- темнее
    crate = Color3.fromRGB(180, 30, 30),
    barrel = Color3.fromRGB(60, 60, 60),
    warning = Color3.fromRGB(220, 40, 40),
    light = Color3.fromRGB(255, 220, 100),
    glass = Color3.fromRGB(200, 230, 255),
    tent = Color3.fromRGB(240, 240, 240),
    line = Color3.fromRGB(255, 255, 255)           -- разметка
}

function part(name, size, pos, color, parent, transparency)
    local p = Instance.new("Part")
    p.Name = name
    p.Size = size
    p.CFrame = CFrame.new(pos)
    p.Color = color
    p.Material = Enum.Material.Plastic
    p.Anchored = true
    p.TopSurface = Enum.SurfaceType.Studs
    p.BottomSurface = Enum.SurfaceType.Inlet
    p.Transparency = transparency or 0
    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
    return w
end

-- ОЧИСТКА
for _, name in pairs({"Map", "NPCs", "Spawns", "GameLogic"}) do
    local old = workspace:FindFirstChild(name)
    if old then old:Destroy() end
end

local map = Instance.new("Folder")
map.Name = "Map"
map.Parent = workspace

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

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

local gameLogic = Instance.new("Folder")
gameLogic.Name = "GameLogic"
gameLogic.Parent = workspace

-- ==================== УЛИЦА ====================
part("Ground", Vector3.new(300, 1, 300), Vector3.new(0, -0.1, 0), C.asphalt, map)

-- Трава (ровно с асфальтом)
part("GrassNorth", Vector3.new(300, 1, 30), Vector3.new(0, -0.1, -165), C.grass, map)
part("GrassSouth", Vector3.new(300, 1, 30), Vector3.new(0, -0.1, 165), C.grass, map)
part("GrassEast", Vector3.new(30, 1, 240), Vector3.new(165, -0.1, 0), C.grass, map)
part("GrassWest", Vector3.new(30, 1, 240), Vector3.new(-165, -0.1, 0), C.grass, map)

-- Разметка дороги (белые линии)
for z = -100, 100, 20 do
    part("Line", Vector3.new(200, 0.1, 1), Vector3.new(0, 0.05, z), C.line, map)
end

-- ==================== ЗАБОР (низкий, 4 studs) ====================
for _, z in pairs({-150, 150}) do
    for x = -150, 150, 8 do
        if math.random() > 0.2 then
            -- Столб
            wall("FencePost", Vector3.new(1, 5, 1), Vector3.new(x, 2.5, z), C.fence, map)
            -- Перемычка
            if x < 150 then
                wall("FenceRail", Vector3.new(8, 1, 1), Vector3.new(x + 4, 4, z), C.fence, map)
            end
        end
    end
end

for _, x in pairs({-150, 150}) do
    for z = -150, 150, 8 do
        if math.random() > 0.2 then
            wall("FencePost", Vector3.new(1, 5, 1), Vector3.new(x, 2.5, z), C.fence, map)
            if z < 150 then
                wall("FenceRail", Vector3.new(1, 1, 8), Vector3.new(x, 4, z + 4), C.fence, map)
            end
        end
    end
end

-- ==================== РЕСЕПШН (больше, выше) ====================
local rx, rz = -80, -80
local reception = Instance.new("Folder")
reception.Name = "Reception"
reception.Parent = map

-- Пол здания
part("Floor", Vector3.new(50, 1, 50), Vector3.new(rx, 0, rz), C.wall_white, reception)

-- Стены (высота 25)
wall("WallBack", Vector3.new(50, 25, 2), Vector3.new(rx, 12.5, rz - 25), C.wall_white, reception)
wall("WallLeft", Vector3.new(2, 25, 50), Vector3.new(rx - 25, 12.5, rz), C.wall_white, reception)
wall("WallRight", Vector3.new(2, 25, 50), Vector3.new(rx + 25, 12.5, rz), C.wall_white, reception)

-- Передняя стена с ДВЕРНЫМ ПРОЁМОМ (10x15)
wall("WallFrontTop", Vector3.new(50, 8, 2), Vector3.new(rx, 21, rz + 25), C.wall_white, reception)
wall("WallFrontLeft", Vector3.new(18, 17, 2), Vector3.new(rx - 16, 8.5, rz + 25), C.wall_white, reception)
wall("WallFrontRight", Vector3.new(18, 17, 2), Vector3.new(rx + 16, 8.5, rz + 25), C.wall_white, reception)

-- Дверь (двойная)
part("DoorLeft", Vector3.new(6, 15, 1), Vector3.new(rx - 3.5, 7.5, rz + 25.5), C.door, reception)
part("DoorRight", Vector3.new(6, 15, 1), Vector3.new(rx + 3.5, 7.5, rz + 25.5), C.door, reception)

-- Крыша (плоская, с выступом)
part("Roof", Vector3.new(54, 2, 54), Vector3.new(rx, 26, rz), C.roof, reception)
part("RoofEdge", Vector3.new(56, 1, 56), Vector3.new(rx, 25.5, rz), C.roof, reception)

-- Окна (большие, 3 штуки)
part("Window1", Vector3.new(2, 10, 15), Vector3.new(rx - 25.5, 12, rz - 10), C.glass, reception, 0.4)
part("Window2", Vector3.new(2, 10, 15), Vector3.new(rx + 25.5, 12, rz + 10), C.glass, reception, 0.4)
part("Window3", Vector3.new(15, 10, 2), Vector3.new(rx + 10, 12, rz - 25.5), C.glass, reception, 0.4)

-- Стойка ресепшна (внутри)
part("Desk", Vector3.new(16, 3, 6), Vector3.new(rx, 1.5, rz + 15), C.wall_grey, reception)
part("DeskTop", Vector3.new(18, 1, 8), Vector3.new(rx, 3, rz + 15), C.wall_white, reception)

-- ==================== КЛАДОВКА (маленькая, крепкая) ====================
local kx, kz = 90, 90
local storage = Instance.new("Folder")
storage.Name = "Storage"
storage.Parent = map

part("Floor", Vector3.new(30, 1, 30), Vector3.new(kx, 0, kz), C.wall_grey, storage)

wall("WallBack", Vector3.new(30, 20, 2), Vector3.new(kx, 10, kz - 15), C.wall_grey, storage)
wall("WallLeft", Vector3.new(2, 20, 30), Vector3.new(kx - 15, 10, kz), C.wall_grey, storage)
wall("WallRight", Vector3.new(2, 20, 30), Vector3.new(kx + 15, 10, kz), C.wall_grey, storage)

-- Дверь (металлическая)
wall("WallFrontTop", Vector3.new(30, 6, 2), Vector3.new(kx, 17, kz + 15), C.wall_grey, storage)
wall("WallFrontLeft", Vector3.new(10, 14, 2), Vector3.new(kx - 10, 7, kz + 15), C.wall_grey, storage)
wall("WallFrontRight", Vector3.new(10, 14, 2), Vector3.new(kx + 10, 7, kz + 15), C.wall_grey, storage)

part("Door", Vector3.new(8, 14, 2), Vector3.new(kx, 7, kz + 15.5), C.door, storage)

part("Roof", Vector3.new(34, 2, 34), Vector3.new(kx, 21, kz), C.roof, storage)

-- Ящики (разные размеры)
part("Crate1", Vector3.new(5, 5, 5), Vector3.new(kx - 8, 2.5, kz - 8), C.crate, storage)
part("Crate2", Vector3.new(4, 4, 4), Vector3.new(kx + 8, 2, kz + 8), C.crate, storage)
part("Crate3", Vector3.new(6, 3, 4), Vector3.new(kx - 5, 1.5, kz + 10), C.crate, storage)

-- ==================== ВЫШКА (массивная) ====================
local vx, vz = 110, -110
local tower = Instance.new("Folder")
tower.Name = "Tower"
tower.Parent = map

-- Бетонное основание
part("Base", Vector3.new(16, 2, 16), Vector3.new(vx, 1, vz), C.wall_grey, tower)

-- Опоры (толстые)
for _, offset in pairs({{-7, -7}, {7, -7}, {-7, 7}, {7, 7}}) do
    wall("Leg", Vector3.new(3, 30, 3), Vector3.new(vx + offset[1], 15, vz + offset[2]), C.fence, tower)
end

-- Платформа (с перилами)
part("Platform", Vector3.new(20, 2, 20), Vector3.new(vx, 31, vz), C.fence, tower)
wall("RailingN", Vector3.new(20, 3, 1), Vector3.new(vx, 33.5, vz - 10), C.fence, tower)
wall("RailingS", Vector3.new(20, 3, 1), Vector3.new(vx, 33.5, vz + 10), C.fence, tower)
wall("RailingW", Vector3.new(1, 3, 20), Vector3.new(vx - 10, 33.5, vz), C.fence, tower)
wall("RailingE", Vector3.new(1, 3, 20), Vector3.new(vx + 10, 33.5, vz), C.fence, tower)

-- Крыша вышки
part("Roof", Vector3.new(24, 3, 24), Vector3.new(vx, 36, vz), C.roof, tower)

-- Лестница (сбоку, металлическая)
for i = 1, 15 do
    local y = i * 2
    part("LadderStep", Vector3.new(4, 0.5, 2), Vector3.new(vx + 12, y, vz), C.fence, tower)
end

-- ==================== ДЕКОР УЛИЦЫ ====================
-- Бочки (разные)
for i = 1, 10 do
    local bx = math.random(-130, 130)
    local bz = math.random(-130, 130)
    -- Не внутри зданий
    if math.abs(bx - rx) > 30 or math.abs(bz - rz) > 30 then
        part("Barrel"..i, Vector3.new(3, 5, 3), Vector3.new(bx, 2.5, bz), C.barrel, map)
    end
end

-- Палатки (прямоугольные)
for i = 1, 4 do
    local tx = math.random(-120, 120)
    local tz = math.random(-120, 120)
    part("TentBase", Vector3.new(12, 1, 12), Vector3.new(tx, 0.5, tz), C.tent, map)
    part("TentRoof", Vector3.new(14, 6, 14), Vector3.new(tx, 3, tz), C.tent, map)
end

-- Знаки "ОПАСНОСТЬ" (на столбах)
for _, pos in pairs({{-60, -60}, {60, 60}, {-60, 60}, {60, -60}}) do
    wall("SignPole", Vector3.new(1, 8, 1), Vector3.new(pos[1], 4, pos[2]), C.fence, map)
    part("SignBoard", Vector3.new(4, 5, 1), Vector3.new(pos[1], 8, pos[2] + 1), C.warning, map)
end

-- Разбитая машина
part("CarBody", Vector3.new(14, 5, 7), Vector3.new(-70, 2.5, 70), C.wall_grey, map)
part("CarHood", Vector3.new(6, 2, 7), Vector3.new(-78, 1, 70), C.wall_grey, map)
part("Wheel1", Vector3.new(3, 3, 1), Vector3.new(-75, 1.5, 67), C.fence, map)
part("Wheel2", Vector3.new(3, 3, 1), Vector3.new(-65, 1.5, 73), C.fence, map)
part("Wheel3", Vector3.new(2, 2, 1), Vector3.new(-78, 1, 67), C.fence, map) -- отвалилось

-- ==================== СПАВНЫ (по углам, яркие) ====================
local spawnData = {
    {"SpawnAlpha", Vector3.new(-140, 0.5, -140), Color3.fromRGB(75, 151, 75)},
    {"SpawnBravo", Vector3.new(-140, 0.5, 140), Color3.fromRGB(196, 40, 28)},
    {"SpawnCharlie", Vector3.new(140, 0.5, -140), Color3.fromRGB(13, 105, 172)},
    {"SpawnDelta", Vector3.new(140, 0.5, 140), Color3.fromRGB(245, 205, 48)}
}

for _, s in pairs(spawnData) do
    local sp = Instance.new("SpawnLocation")
    sp.Name = s[1]
    sp.Size = Vector3.new(8, 1, 8)
    sp.CFrame = CFrame.new(s[2])
    sp.Color = s[3]
    sp.Material = Enum.Material.Plastic
    sp.TopSurface = Enum.SurfaceType.Studs
    sp.BottomSurface = Enum.SurfaceType.Inlet
    sp.Parent = spawns
end

-- ==================== УЛИЧНЫЕ ФОНАРИ (высокие) ====================
for _, pos in pairs({{-100, -100}, {100, 100}, {-100, 100}, {100, -100}, {0, 0}}) do
    wall("LampPole", Vector3.new(1, 15, 1), Vector3.new(pos[1], 7.5, pos[2]), C.fence, map)
    part("LampHead", Vector3.new(4, 3, 4), Vector3.new(pos[1], 16, pos[2]), C.light, map)
    
    local light = Instance.new("PointLight")
    light.Brightness = 8
    light.Range = 40
    light.Color = Color3.fromRGB(255, 255, 200)
    light.Parent = map:FindFirstChild("LampHead", true)
end

-- ==================== ПАРАЗИТ ====================
local parasite = Instance.new("Part")
parasite.Name = "Parasite"
parasite.Shape = Enum.PartType.Ball
parasite.Size = Vector3.new(2, 2, 2)
parasite.Position = Vector3.new(0, 50, 0)
parasite.Color = Color3.fromRGB(0, 0, 0)
parasite.Material = Enum.Material.Plastic
parasite.Transparency = 0.5
parasite.Anchored = true
parasite.Parent = gameLogic

local pLight = Instance.new("PointLight")
pLight.Color = Color3.fromRGB(255, 0, 0)
pLight.Brightness = 5
pLight.Range = 10
pLight.Parent = parasite

-- ==================== ТОЧКИ NPC (больше, разбросано) ====================
local npcZones = {
    {"Reception", -80, -80},
    {"Street1", -50, 0},
    {"Street2", 50, 0},
    {"Street3", 0, -50},
    {"Street4", 0, 50},
    {"Street5", -100, 100},
    {"Street6", 100, -100},
    {"Storage", 90, 90},
    {"Tower", 110, -110},
    {"Fence1", -140, 0},
    {"Fence2", 140, 0},
    {"Center", 0, 0}
}

for _, zone in pairs(npcZones) do
    local f = Instance.new("Folder")
    f.Name = zone[1] .. "_Points"
    f.Parent = npcs
    
    for i = 1, 5 do
        local point = Instance.new("Part")
        point.Name = "Point" .. i
        point.Size = Vector3.new(1, 1, 1)
        point.CFrame = CFrame.new(
            zone[2] + math.random(-25, 25),
            0.5,
            zone[3] + math.random(-25, 25)
        )
        point.Transparency = 1
        point.CanCollide = false
        point.Anchored = true
        point.Parent = f
    end
end

print("=== ЛАБОРАТОРИЯ ЧП v2 ===")
print("Улучшения:")
print("- Забор: низкий, столбы+перемычки")
print("- Здания: выше, чёткие двери")
print("- Разметка дороги")
print("- Больше декора")
print("- Масштаб: 300x300")