Загрузка данных
-- ЛАБОРАТОРИЯ ЧП 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")