Files
mmkrp_2026/addons/!kostich/lua/autorun/client/!event_stuff.lua
2026-03-15 14:54:49 +03:00

2145 lines
72 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
local base_url = "http://dev.pavetr.ru/server/senwai-mmk/posters/"
local agits = {
{
pos = Vector(2351.97, -62, 160),
ang = Angle(0, 180, 90),
url = base_url .. "soup.png",
width = 500,
height = 400,
scale = 0.1,
show = "m"
},
{
pos = Vector(2270, -62, 160),
ang = Angle(0, 180, 90),
url = base_url .. "whatissup.png",
width = 500,
height = 400,
scale = 0.1,
show = "u"
},
{
pos = Vector(-626.13, -965, 160),
ang = Angle(0, 0, 90),
url = base_url .. "supforpidor.png",
width = 400,
height = 500,
scale = 0.1,
show = "m"
},
{
pos = Vector(2661.47, -1540, 160),
ang = Angle(0, 180, 90),
url = base_url .. "senwaidox.png",
width = 500,
height = 400,
scale = 0.1,
show = "u"
},
{
pos = Vector(89.12, 380, 160),
ang = Angle(0, 0, 90),
url = base_url .. "wantsup.png",
width = 500,
height = 650,
scale = 0.1,
show = "m"
},
{
pos = Vector(5470, 1340, 160),
ang = Angle(0, -90, 90),
url = base_url .. "7733sup.png",
width = 500,
height = 500,
scale = 0.1,
show = "u"
},
{
pos = Vector(1580.32, 2175, 245),
ang = Angle(0, 0, 90),
url = base_url .. "jockddos.png",
width = 500,
height = 550,
scale = 0.1,
show = "m"
},
{
pos = Vector(4300, -4157, 160),
ang = Angle(0, 180, 90),
url = base_url .. "10sup.png",
width = 500,
height = 500,
scale = 0.1,
show = "u"
},
{
pos = Vector(7885, 5905, 1145),
ang = Angle(0, 90, 90),
url = base_url .. "sup.png",
width = 500,
height = 500,
scale = 0.1,
},
{
pos = Vector(3776.82, 382, 160),
ang = Angle(0, 0, 90),
url = base_url .. "gafich.png",
width = 550,
height = 500,
scale = 0.1,
},
{
pos = Vector(644, -1280, 160),
ang = Angle(0, 90, 90),
url = base_url .. "skipper.png",
width = 700,
height = 500,
scale = 0.1,
},
{
pos = Vector(-1035, -2280, 180),
ang = Angle(0, 90 + 40, 90),
url = base_url .. "snegiri.png",
width = 1500,
height = 800,
scale = 0.1,
},
}
local u_cnt = 0
local m_cnt = 0
for z, v in ipairs(agits) do
if v.show == "m" then
m_cnt = m_cnt + 1
elseif v.show == "u" then
u_cnt = u_cnt + 1
end
end
local cur_params
local save = "kostich_saves.dat"
timer.Create("removeRagdolls", 3, 0, function() game.RemoveRagdolls() end)
local function save_settings()
file.Write(save, util.Base64Encode(util.TableToJSON(cur_params)))
end
local def_cfg = {
hud = "kostich",
tab = "kostich",
cmenu = "kostich",
selector = "kostich",
posters = "",
plib = true
}
local function load_settings()
if file.Exists(save, "DATA") then
cur_params = util.JSONToTable(util.Base64Decode(file.Read(save, "DATA")))
for z, v in ipairs(def_cfg) do
if not cur_params[z] then
cur_params[z] = v
end
end
end
end
if not file.Exists(save, "DATA") then
cur_params = def_cfg
save_settings()
else
load_settings()
end
gameevent.Listen("client_disconnect")
hook.Add("client_disconnect", "kostich.saveOnExit", function(data)
save_settings()
end)
kostich = kostich or {}
function kostich.getValue(key)
return cur_params[key]
end
local red = Color(255, 0, 0)
-- 5.5 sec
function kostich.ss1()
surface.PlaySound("ambient/levels/labs/electric_explosion1.wav")
LocalPlayer():ScreenFade(SCREENFADE.IN, Color(0, 0, 0, 255), 0.3, 0)
timer.Simple(0.3, function()
cur_params["hud"] = "drp"
save_settings()
chat.AddText(red, "[ИВЕНТ] ", color_white, "Ваш худ от сапа исчез и заменился на даркрпшный")
end)
timer.Simple(0.5, function()
surface.PlaySound("pavetr_mmk/vo/player1.mp3")
chat.AddText(color_white, "- Блять, что за хуйня!? Куда худ пропал")
timer.Simple(2.5, function()
surface.PlaySound("pavetr_mmk/vo/player2.mp3")
chat.AddText(color_white, "- Я даже хз кто это мог сделать, а хотя...")
timer.Simple(2.5, function()
surface.PlaySound("pavetr_mmk/vo/player3.mp3")
chat.AddText(color_white, "- Точно! Надо у сенвая спросить, он пиздюк еще тот")
end)
end)
end)
end
-- 8.5 sec
function kostich.ss2()
surface.PlaySound("ambient/levels/labs/electric_explosion1.wav")
LocalPlayer():ScreenFade(SCREENFADE.IN, Color(0, 0, 0, 255), 0.3, 0)
timer.Simple(0.3, function()
cur_params["plib"] = false
save_settings()
chat.AddText(red, "[ИВЕНТ] ", color_white, "У вас отъебнуло plibv2")
LocalPlayer():ScreenFade(SCREENFADE.IN, Color(0, 0, 0, 255), 0.3, 0)
end)
timer.Simple(1, function()
surface.PlaySound("pavetr_mmk/vo/player4.mp3")
chat.AddText(color_white, "- Сука что на этот раз")
timer.Create("plib_emit_errors", 0.2, 5, function()
ErrorNoHalt("У вас наебнулся plib_v2")
end)
timer.Simple(1.5, function()
surface.PlaySound("pavetr_mmk/vo/player5.mp3")
chat.AddText(color_white, "- Ебаный рот какие-то ошибки сука")
timer.Simple(2, function()
surface.PlaySound("pavetr_mmk/vo/player6.mp3")
chat.AddText(color_white, "- Чооо plib2, пиздец сенвай так всю сборку расхуярит")
timer.Simple(4, function()
surface.PlaySound("pavetr_mmk/vo/player7.mp3")
chat.AddText(color_white, "- Надо быстрее к паветру идти")
end)
end)
end)
end)
end
-- 2 sec
function kostich.myarena_ddosed()
surface.PlaySound("ambient/levels/labs/electric_explosion1.wav")
LocalPlayer():ScreenFade(SCREENFADE.IN, Color(0, 0, 0, 255), 0.3, 0)
timer.Simple(0.3, function()
surface.PlaySound("ambient/explosions/explode_8.wav")
chat.AddText(red, "[ИВЕНТ] ", color_white, "В датацентре что-то взорвалось")
LocalPlayer():ScreenFade(SCREENFADE.IN, Color(0, 0, 0, 255), 0.3, 0)
end)
timer.Simple(0.5, function()
surface.PlaySound("plats/elevbell1.wav")
chat.AddText(color_white, "Filip Bozhenko: Ку мне Васты крашат, я хз чем")
timer.Simple(0.5, function()
surface.PlaySound("plats/elevbell1.wav")
chat.AddText(color_white, "whiteroom: Ку мне Джасты крашат, я хз чем")
timer.Simple(0.5, function()
surface.PlaySound("plats/elevbell1.wav")
chat.AddText(color_white, "senwai: Босс Инферно не дудось пж")
timer.Simple(0.5, function()
surface.PlaySound("pavetr_mmk/vo/player8.mp3")
chat.AddText(color_white, "- Пиздец там все разнесло конечно")
end)
end)
end)
end)
end
function kostich.hacker_game()
local stat
sound.PlayFile("sound/pavetr_mmk/music/Pavetr-Give_Talon.mp3", "noplay", function(station, errCode, errStr)
if IsValid(station) then
station:Play()
station:SetVolume(2)
stat = station
else
print("Error playing sound!", errCode, errStr)
end
end)
local ply = LocalPlayer()
local rows, cols = 6, 9
local cellSize = 64
local spacing = 4
local win = vgui.Create("DFrame")
win:SetTitle("Жигуль бекдур™ Loader")
win:SetSize(ScrW(), ScrH())
win:Center()
win:MakePopup()
win:SetDraggable(false)
win:ShowCloseButton(true)
local col1 = Color(20, 20, 25, 255)
local col2 = Color(0, 150, 255)
local drops = {}
local next_char_change = 0
local char_cache = {}
for i = 33, 126 do table.insert(char_cache, string.char(i)) end
win.OnClose = function()
if IsValid(stat) then
stat:Stop()
end
end
win.Paint = function(s, w, h)
draw.RoundedBox(0, 0, 0, w, h, col1 or Color(0, 0, 0, 240))
local fontSize = 18
local columns = math.floor(w / fontSize)
if #drops == 0 then
for i = 1, columns do
drops[i] = {
y = math.random(-h, 0),
speed = math.random(10, 30),
text = {}
}
for j = 1, 15 do drops[i].text[j] = table.Random(char_cache) end
end
end
surface.SetFont("ui.18")
local time = RealTime()
local do_change = false
if time > next_char_change then
do_change = true
next_char_change = time + 0.05
end
for i = 1, columns do
local drop = drops[i]
for j = 1, 12 do
local charY = drop.y - (j * fontSize)
if charY < h + fontSize and charY > -fontSize then
local alpha = 255 - (j * 20)
if alpha > 0 then
if j == 1 then
surface.SetTextColor(200, 255, 200, alpha)
else
surface.SetTextColor(0, 255, 0, alpha)
end
surface.SetTextPos((i - 1) * fontSize, charY)
if do_change and math.random() > 0.9 then
drop.text[j] = table.Random(char_cache)
end
surface.DrawText(drop.text[j] or "0")
end
end
end
drop.y = drop.y + (drop.speed * FrameTime() * 10)
if drop.y > h + 200 then
drop.y = -fontSize * 2
drop.speed = math.random(10, 35)
end
end
draw.RoundedBox(0, 0, 0, w, 24, col2 or Color(50, 50, 50))
draw.SimpleText("Если вы закроете окно, пропишите play_hacker в консоль чтобы начать игру снова", "ui.20", 12, 36,
color_white)
end
local grid = {}
local visited = {}
local stack = {}
for y = 1, rows do
grid[y] = {}
for x = 1, cols do
grid[y][x] = {
type = 0,
rot = 0,
powered = false,
neighbors = { top = false, right = false, bottom = false, left = false }
}
end
end
local current = { x = 1, y = 1 }
visited[1] = { [1] = true }
table.insert(stack, current)
while #stack > 0 do
local neighbors = {}
local dirs = {
{ dx = 0, dy = -1, name = "top", op = "bottom" },
{ dx = 1, dy = 0, name = "right", op = "left" },
{ dx = 0, dy = 1, name = "bottom", op = "top" },
{ dx = -1, dy = 0, name = "left", op = "right" }
}
for _, d in ipairs(dirs) do
local nx, ny = current.x + d.dx, current.y + d.dy
if nx > 0 and nx <= cols and ny > 0 and ny <= rows then
visited[ny] = visited[ny] or {}
if not visited[ny][nx] then
table.insert(neighbors, { x = nx, y = ny, dir = d.name, op = d.op })
end
end
end
if #neighbors > 0 then
local nextCell = neighbors[math.random(#neighbors)]
grid[current.y][current.x].neighbors[nextCell.dir] = true
grid[nextCell.y][nextCell.x].neighbors[nextCell.op] = true
current = { x = nextCell.x, y = nextCell.y }
visited[current.y][current.x] = true
table.insert(stack, current)
else
current = table.remove(stack)
end
end
for y = 1, rows do
for x = 1, cols do
local cell = grid[y][x]
local c = 0
if cell.neighbors.top then c = c + 1 end
if cell.neighbors.right then c = c + 2 end
if cell.neighbors.bottom then c = c + 4 end
if cell.neighbors.left then c = c + 8 end
if c == 5 or c == 10 then
cell.type = 1
elseif c == 3 or c == 6 or c == 9 or c == 12 then
cell.type = 2
elseif c == 7 or c == 11 or c == 13 or c == 14 then
cell.type = 3
elseif c == 15 then
cell.type = 4
else
cell.type = 1
end
cell.rot = math.random(0, 3)
end
end
local function GetConnections(type, rot)
local conns = { false, false, false, false }
if type == 1 then
conns = { true, false, true, false }
elseif type == 2 then
conns = { true, true, false, false }
elseif type == 3 then
conns = { true, true, true, false }
elseif type == 4 then
conns = { true, true, true, true }
end
local rotated = {}
for i = 1, 4 do
local index = (i - 1 - rot) % 4 + 1
rotated[i] = conns[index]
end
return rotated
end
local function UpdatePower()
for y = 1, rows do
for x = 1, cols do
grid[y][x].powered = false
end
end
local q = { { x = 1, y = 1 } }
grid[1][1].powered = true
local head = 1
while head <= #q do
local curr = q[head]
head = head + 1
local cx, cy = curr.x, curr.y
local cell = grid[cy][cx]
local conns = GetConnections(cell.type, cell.rot)
local dirs = {
{ dx = 0, dy = -1, idx = 1, opp = 3 },
{ dx = 1, dy = 0, idx = 2, opp = 4 },
{ dx = 0, dy = 1, idx = 3, opp = 1 },
{ dx = -1, dy = 0, idx = 4, opp = 2 }
}
for _, d in ipairs(dirs) do
if conns[d.idx] then
local nx, ny = cx + d.dx, cy + d.dy
if nx > 0 and nx <= cols and ny > 0 and ny <= rows then
local neighbor = grid[ny][nx]
local nConns = GetConnections(neighbor.type, neighbor.rot)
if nConns[d.opp] and not neighbor.powered then
neighbor.powered = true
table.insert(q, { x = nx, y = ny })
end
end
end
end
end
if grid[rows][cols].powered then
chat.AddText(Color(0, 255, 0), "[ЖИГУЛЬ] ", Color(255, 255, 255),
"Успех! Файл `bruhdecomp.exe` загружен на сервер Senwai-VDS.")
surface.PlaySound("buttons/button14.wav")
RunConsoleCommand("success_hacking")
win:Close()
end
end
local container = vgui.Create("DGrid", win)
container:SetSize(cols * cellSize + 20, rows * cellSize + 50)
container:SetCols(cols)
container:SetColWide(cellSize)
container:SetRowHeight(cellSize)
container:Center()
for y = 1, rows do
for x = 1, cols do
local btn = vgui.Create("DButton")
btn:SetText("")
btn:SetSize(cellSize, cellSize)
btn.DoClick = function()
grid[y][x].rot = (grid[y][x].rot + 1) % 4
surface.PlaySound("common/wpn_select.wav")
UpdatePower()
end
btn.Paint = function(s, w, h)
local cell = grid[y][x]
local isPowered = cell.powered
local col = isPowered and Color(0, 255, 100) or Color(50, 50, 60)
if x == 1 and y == 1 then col = Color(0, 150, 255) end
if x == cols and y == rows then col = isPowered and Color(0, 255, 0) or Color(255, 50, 50) end
draw.RoundedBox(0, 0, 0, w, h, Color(30, 30, 35))
local cx, cy = w / 2, h / 2
local thick = 8
local conns = GetConnections(cell.type, cell.rot)
surface.SetDrawColor(col)
if conns[1] then surface.DrawRect(cx - thick / 2, 0, thick, cy) end
if conns[2] then surface.DrawRect(cx, cy - thick / 2, cx, thick) end
if conns[3] then surface.DrawRect(cx - thick / 2, cy, thick, cy) end
if conns[4] then surface.DrawRect(0, cy - thick / 2, cx, thick) end
surface.DrawRect(cx - thick, cy - thick, thick * 2, thick * 2)
end
container:AddItem(btn)
end
end
UpdatePower()
end
function kostich.bank_game()
local stat
sound.PlayFile("sound/pavetr_mmk/music/Senwai-Avtoritet.mp3", "noplay", function(station, errCode, errStr)
if IsValid(station) then
station:Play()
station:SetVolume(1)
stat = station
end
end)
local ply = LocalPlayer()
-- Настройки окна
local win = vgui.Create("DFrame")
win:SetTitle("SENWAI_OS v3.0 // BANK_SECURITY_BREACH")
win:SetSize(ScrW(), ScrH())
win:Center()
win:MakePopup()
win:SetDraggable(false)
win:ShowCloseButton(true)
-- Цвета (в стиле твоего примера)
local col_bg = Color(20, 20, 25, 255)
local col_accent = Color(0, 150, 255)
local col_accent_dim = Color(0, 150, 255, 50)
local col_text = Color(200, 255, 200)
local col_highlight = Color(255, 200, 50) -- Цвет для активной строки/столбца
-- == ФОНОВАЯ АНИМАЦИЯ (МАТРИЦА) ==
local drops = {}
local char_cache = {}
for i = 33, 126 do table.insert(char_cache, string.char(i)) end
win.OnClose = function()
if IsValid(stat) then stat:Stop() end
end
win.Paint = function(s, w, h)
-- Отрисовка фона
draw.RoundedBox(0, 0, 0, w, h, col_bg)
-- Логика дождя символов (из твоего кода)
local fontSize = 18
surface.SetFont("ui.18")
local columns = math.floor(w / fontSize)
if #drops == 0 then
for i = 1, columns do
drops[i] = {
y = math.random(-h, 0),
speed = math.random(10, 30),
text = {}
}
for j = 1, 15 do drops[i].text[j] = table.Random(char_cache) end
end
end
for i = 1, columns do
local drop = drops[i]
for j = 1, 12 do
local charY = drop.y - (j * fontSize)
if charY < h + fontSize and charY > -fontSize then
local alpha = 100 - (j * 5) -- Сделал чуть тусклее, чтобы не мешало игре
if alpha > 0 then
surface.SetTextColor(0, 150, 255, alpha) -- Синий оттенок для кибер-стиля
surface.SetTextPos((i - 1) * fontSize, charY)
if math.random() > 0.95 then drop.text[j] = table.Random(char_cache) end
surface.DrawText(drop.text[j] or "0")
end
end
end
drop.y = drop.y + (drop.speed * FrameTime() * 10)
if drop.y > h + 200 then
drop.y = -fontSize * 2
drop.speed = math.random(10, 35)
end
end
end
-- == ЛОГИКА ИГРЫ ==
local gridSize = 6 -- Размер сетки 6x6
local hexValues = { "1C", "BD", "55", "E9", "7A", "FF" }
local gridData = {}
local requiredSequence = {}
local playerSequence = {}
local timerStart = CurTime()
local timeLimit = 45 -- Секунд на взлом
local isGameOver = false
-- Состояние курсора:
-- axis: "row" (горизонтально) или "col" (вертикально)
-- index: номер текущей строки или столбца
local activeState = { axis = "row", index = 1 }
-- Генерация уровня так, чтобы он был проходим
local function GenerateLevel()
-- 1. Создаем пустую сетку
for y = 1, gridSize do
gridData[y] = {}
for x = 1, gridSize do
gridData[y][x] = { val = table.Random(hexValues), used = false }
end
end
-- 2. Генерируем гарантированно правильный путь (4 шага)
local pathLength = 4
local cx, cy = math.random(1, gridSize), 1 -- Начинаем всегда с первой строки
local pathAxis = "row" -- Первый ход выбирается из строки
-- Записываем первый шаг
gridData[cy][cx].val = table.Random(hexValues)
table.insert(requiredSequence, gridData[cy][cx].val)
-- Симуляция следующих шагов
local simX, simY = cx, cy
local simAxis = "col" -- После выбора в строке, следующий выбор в столбце
for i = 2, pathLength do
local nextVal = table.Random(hexValues)
if simAxis == "col" then
-- Выбираем новую строку в том же столбце
local newY = math.random(1, gridSize)
while newY == simY do newY = math.random(1, gridSize) end
simY = newY
else
-- Выбираем новый столбец в той же строке
local newX = math.random(1, gridSize)
while newX == simX do newX = math.random(1, gridSize) end
simX = newX
end
gridData[simY][simX].val = nextVal
table.insert(requiredSequence, nextVal)
-- Инвертируем ось для следующего шага
simAxis = (simAxis == "row") and "col" or "row"
end
-- Заполняем остальные ячейки случайным мусором (уже сделано в шаге 1, но перезапишем путь)
-- Путь уже записан в сетку, так что всё ок.
end
GenerateLevel()
-- == ИНТЕРФЕЙС ИГРЫ ==
local mainPanel = vgui.Create("DPanel", win)
mainPanel:SetSize(800, 600)
mainPanel:Center()
mainPanel.Paint = function(s, w, h)
-- Рамка вокруг игровой зоны
surface.SetDrawColor(col_accent)
surface.DrawOutlinedRect(0, 0, w, h, 2)
draw.RoundedBox(0, 0, 0, w, h, Color(10, 10, 15, 240))
end
-- Верхняя панель: Таймер и Цель
local infoPanel = vgui.Create("DPanel", mainPanel)
infoPanel:SetPos(20, 20)
infoPanel:SetSize(760, 100)
infoPanel.Paint = function(s, w, h)
if isGameOver then return end
-- Таймер / Полоса обнаружения
local timeLeft = math.max(0, timeLimit - (CurTime() - timerStart))
local pct = timeLeft / timeLimit
draw.SimpleText("ОБНАРУЖЕНИЕ ВТОРЖЕНИЯ:", "DermaDefaultBold", 0, 0, Color(255, 50, 50))
draw.RoundedBox(0, 0, 20, w, 20, Color(50, 0, 0))
draw.RoundedBox(0, 0, 20, w * (1 - pct), 20, Color(255, 0, 0)) -- Красная полоса растет
if timeLeft <= 0 then
isGameOver = true
surface.PlaySound("buttons/button10.wav")
chat.AddText(Color(255, 0, 0), "[ВЗЛОМ] ", Color(255, 255, 255), "Время истекло! Система заблокирована.")
win:Close()
kostich.bank_game()
end
-- Отображение необходимой последовательности
draw.SimpleText("ТРЕБУЕМЫЙ БУФЕР:", "DermaDefaultBold", 0, 50, col_accent)
for i, code in ipairs(requiredSequence) do
local col = Color(100, 100, 100)
-- Если этот код уже собран
if i <= #playerSequence then
col = Color(0, 255, 0)
-- Если это следующий код
elseif i == #playerSequence + 1 then
col = Color(255, 255, 255)
end
draw.SimpleText(code, "DermaLarge", 150 + (i * 60), 45, col)
end
end
-- Сетка кнопок
local gridBaseX, gridBaseY = 150, 150
local cellSize = 60
local gap = 10
for y = 1, gridSize do
for x = 1, gridSize do
local btn = vgui.Create("DButton", mainPanel)
btn:SetPos(gridBaseX + (x - 1) * (cellSize + gap), gridBaseY + (y - 1) * (cellSize + gap))
btn:SetSize(cellSize, cellSize)
btn:SetText(gridData[y][x].val)
btn:SetFont("DermaLarge")
btn:SetColor(col_text)
btn.Paint = function(s, w, h)
local isHovered = s:IsHovered()
local cell = gridData[y][x]
-- Логика подсветки доступности
local isActive = false
if not isGameOver and not cell.used then
if activeState.axis == "row" and activeState.index == y then isActive = true end
if activeState.axis == "col" and activeState.index == x then isActive = true end
end
-- Отрисовка фона кнопки
local drawCol = Color(40, 40, 45)
if cell.used then
drawCol = Color(20, 20, 20) -- Уже нажата
s:SetColor(Color(50, 50, 50))
elseif isActive then
drawCol = Color(60, 60, 70)
if isHovered then drawCol = col_accent end -- Подсветка при наведении
-- Рисуем линию-подсветку через всю строку/столбец (визуальный эффект)
else
s:SetColor(Color(100, 100, 100, 50)) -- Неактивные тусклые
end
draw.RoundedBox(4, 0, 0, w, h, drawCol)
-- Рамка для активной оси
if isActive and not isHovered then
surface.SetDrawColor(col_accent_dim)
surface.DrawOutlinedRect(0, 0, w, h)
end
end
btn.DoClick = function()
if isGameOver then return end
local cell = gridData[y][x]
-- Проверка валидности хода
local isValidMove = false
if not cell.used then
if activeState.axis == "row" and activeState.index == y then isValidMove = true end
if activeState.axis == "col" and activeState.index == x then isValidMove = true end
end
if not isValidMove then
surface.PlaySound("buttons/button10.wav") -- Звук ошибки
return
end
-- Логика хода
cell.used = true
table.insert(playerSequence, cell.val)
-- Проверка правильности
local currentStep = #playerSequence
if playerSequence[currentStep] ~= requiredSequence[currentStep] then
-- ОШИБКА! Сброс прогресса (немного упростим - сбросим только последние ходы или просто проигрыш)
-- Хардкорный вариант: ошибка сбрасывает часть буфера
surface.PlaySound("buttons/button8.wav")
playerSequence = {} -- Полный сброс буфера игрока при ошибке
-- Опционально: уменьшить время таймера при ошибке
timeLimit = timeLimit - 5
else
surface.PlaySound("buttons/button3.wav")
end
-- Смена оси
if activeState.axis == "row" then
activeState.axis = "col"
activeState.index = x
else
activeState.axis = "row"
activeState.index = y
end
-- Проверка победы
if #playerSequence == #requiredSequence then
isGameOver = true
surface.PlaySound("buttons/button14.wav")
chat.AddText(Color(0, 255, 0), "[SenwaiOS] ", Color(255, 255, 255),
"Эксплоит установлен! Деньги переводятся...")
net.Start("pavetr.done_bank")
net.SendToServer()
win:Close()
end
end
end
end
-- Декоративные линии для понимания оси
local overlay = vgui.Create("DPanel", mainPanel)
overlay:SetSize(800, 600)
overlay:SetMouseInputEnabled(false) -- Чтобы кликать сквозь
overlay.Paint = function(s, w, h)
if isGameOver then return end
local startX, startY = gridBaseX, gridBaseY
local fullSize = (cellSize + gap) * gridSize
surface.SetDrawColor(Color(255, 200, 0, 30)) -- Желтая подсветка текущей линии
if activeState.axis == "row" then
local yPos = startY + (activeState.index - 1) * (cellSize + gap)
draw.RoundedBox(0, startX - 10, yPos - 5, fullSize, cellSize + 10, Color(0, 150, 255, 20))
else
local xPos = startX + (activeState.index - 1) * (cellSize + gap)
draw.RoundedBox(0, xPos - 5, startY - 10, cellSize + 10, fullSize, Color(0, 150, 255, 20))
end
end
end
function kostich.satellite_game()
local stat
sound.PlayFile("sound/music/hl2_song6.mp3", "noplay", function(station, errCode, errStr)
if IsValid(station) then
station:Play()
station:SetVolume(0.5)
stat = station
else
print("Error playing sound!", errCode, errStr)
end
end)
local ply = LocalPlayer()
local rows, cols = 8, 8
local cellSize = 50
local warehouseCount = 8
local win = vgui.Create("DFrame")
win:SetTitle("SATELLITE-GPS: Target Locator v2.0")
win:SetSize(ScrW(), ScrH())
win:Center()
win:MakePopup()
win:SetDraggable(false)
win:ShowCloseButton(true)
local colBG = Color(10, 15, 20, 250)
local colGrid = Color(0, 150, 255)
local colHidden = Color(30, 35, 40)
local colScanned = Color(50, 50, 55)
local colTarget = Color(255, 50, 50)
local colText = Color(100, 255, 100)
local drops = {}
local next_char_change = 0
local char_cache = {}
for i = 33, 126 do table.insert(char_cache, string.char(i)) end
win.OnClose = function()
if IsValid(stat) then stat:Stop() end
end
win.Paint = function(s, w, h)
draw.RoundedBox(0, 0, 0, w, h, colBG)
local fontSize = 18
local columns = math.floor(w / fontSize)
if #drops == 0 then
for i = 1, columns do
drops[i] = { y = math.random(-h, 0), speed = math.random(10, 30), text = {} }
for j = 1, 15 do drops[i].text[j] = table.Random(char_cache) end
end
end
surface.SetFont("DermaDefault")
local time = RealTime()
local do_change = false
if time > next_char_change then
do_change = true
next_char_change = time + 0.05
end
for i = 1, columns do
local drop = drops[i]
for j = 1, 12 do
local charY = drop.y - (j * fontSize)
if charY < h + fontSize and charY > -fontSize then
local alpha = 100 - (j * 8)
if alpha > 0 then
surface.SetTextColor(0, 255, 0, alpha)
surface.SetTextPos((i - 1) * fontSize, charY)
if do_change and math.random() > 0.9 then drop.text[j] = table.Random(char_cache) end
surface.DrawText(drop.text[j] or "0")
end
end
end
drop.y = drop.y + (drop.speed * FrameTime() * 10)
if drop.y > h + 200 then
drop.y = -fontSize * 2
drop.speed = math.random(10, 35)
end
end
draw.SimpleText("ЗАДАЧА: ОБНАРУЖИТЬ СКЛАДЫ (" .. warehouseCount .. " шт)", "DermaLarge", w / 2, 50,
Color(255, 200, 0), TEXT_ALIGN_CENTER)
draw.SimpleText("Клик по сектору для сканирования. Цифры указывают количество целей рядом.", "DermaDefault", w /
2, 85, color_white, TEXT_ALIGN_CENTER)
end
local grid = {}
local foundCount = 0
local isGameOver = false
for y = 1, rows do
grid[y] = {}
for x = 1, cols do
grid[y][x] = {
isTarget = false,
revealed = false,
neighborCount = 0
}
end
end
local placed = 0
while placed < warehouseCount do
local rx, ry = math.random(1, cols), math.random(1, rows)
if not grid[ry][rx].isTarget then
grid[ry][rx].isTarget = true
placed = placed + 1
end
end
for y = 1, rows do
for x = 1, cols do
if not grid[y][x].isTarget then
local count = 0
for dy = -1, 1 do
for dx = -1, 1 do
local ny, nx = y + dy, x + dx
if ny >= 1 and ny <= rows and nx >= 1 and nx <= cols then
if grid[ny][nx].isTarget then count = count + 1 end
end
end
end
grid[y][x].neighborCount = count
end
end
end
local container = vgui.Create("DGrid", win)
container:SetSize(cols * cellSize + 20, rows * cellSize + 20)
container:SetCols(cols)
container:SetColWide(cellSize)
container:SetRowHeight(cellSize)
container:Center()
for y = 1, rows do
for x = 1, cols do
local btn = vgui.Create("DButton")
btn:SetText("")
btn:SetSize(cellSize, cellSize)
btn.Paint = function(s, w, h)
local cell = grid[y][x]
surface.SetDrawColor(0, 0, 0, 200)
surface.DrawOutlinedRect(0, 0, w, h)
if not cell.revealed then
draw.RoundedBox(0, 1, 1, w - 2, h - 2, colHidden)
surface.SetDrawColor(0, 50, 100, 100)
if math.random() > 0.99 then
surface.SetDrawColor(100, 255, 255, 150)
end
surface.DrawOutlinedRect(2, 2, w - 4, h - 4)
else
if cell.isTarget then
draw.RoundedBox(0, 1, 1, w - 2, h - 2, colTarget)
draw.SimpleText("TARGET", "DermaDefault", w / 2, h / 2, color_black, TEXT_ALIGN_CENTER,
TEXT_ALIGN_CENTER)
else
draw.RoundedBox(0, 1, 1, w - 2, h - 2, colScanned)
if cell.neighborCount > 0 then
local intense = math.min(255, cell.neighborCount * 50)
draw.SimpleText(cell.neighborCount, "DermaLarge", w / 2, h / 2,
Color(255, 255 - intense, 255 - intense), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
end
end
end
if s:IsHovered() and not cell.revealed then
surface.SetDrawColor(255, 255, 255, 30)
surface.DrawRect(0, 0, w, h)
end
end
btn.DoClick = function()
local cell = grid[y][x]
if cell.revealed or isGameOver then return end
cell.revealed = true
if cell.isTarget then
surface.PlaySound("buttons/blip1.wav")
foundCount = foundCount + 1
if foundCount >= warehouseCount then
isGameOver = true
chat.AddText(Color(0, 255, 0), "[СПУТНИК] ", Color(255, 255, 255),
"Все цели обнаружены. Координаты отправлены.")
surface.PlaySound("buttons/button14.wav")
RunConsoleCommand("success_sat")
win:Close()
end
else
surface.PlaySound("buttons/lightswitch2.wav")
end
end
container:AddItem(btn)
end
end
end
-- 2.5 sec
function kostich.boom()
surface.PlaySound("ambient/explosions/explode_3.wav")
LocalPlayer():ScreenFade(SCREENFADE.IN, Color(0, 0, 0, 255), 0.3, 0)
timer.Simple(0.3, function()
surface.PlaySound("ambient/explosions/explode_2.wav")
chat.AddText(red, "[ИВЕНТ] ", color_white, "Слышны взрывы")
end)
timer.Simple(2, function()
surface.PlaySound("pavetr_mmk/vo/player9.mp3")
chat.AddText(color_white, "- Это еще че за хуйня")
timer.Simple(1, function()
surface.PlaySound("npc/overwatch/radiovoice/off2.wav")
chat.AddText(color_white, "[Рация] Это Мейби Пастер бомбит склады сенвая")
timer.Simple(2, function()
surface.PlaySound("pavetr_mmk/vo/player10.mp3")
chat.AddText(color_white, "- Аа нихуя себе")
timer.Simple(2, function()
surface.PlaySound("pavetr_mmk/vo/player11.mp3")
chat.AddText(color_white, "- Надо быстрее нападать пока они не опомнились")
end)
end)
end)
end)
end
concommand.Add("play_hacker", function()
kostich.hacker_game()
end)
concommand.Add("play_gps", function()
kostich.satellite_game()
end)
function kostich.addMarlyaPosters()
local posters = kostich.getValue("posters")
if not string.find(posters:lower(), "m") then
cur_params["posters"] = cur_params["posters"] .. "m"
end
chat.AddText(Color(0, 255, 0), "[ПОСТЕРЫ] ", Color(255, 255, 255),
"На карте появились постеры Марли (" .. m_cnt .. "шт.)")
save_settings()
end
function kostich.addGenaPosters()
local posters = kostich.getValue("posters")
if not string.find(posters:lower(), "u") then
cur_params["posters"] = cur_params["posters"] .. "u"
end
chat.AddText(Color(0, 255, 0), "[ПОСТЕРЫ] ", Color(255, 255, 255),
"На карте появились постеры Урбанички (" .. u_cnt .. "шт.)")
save_settings()
end
function kostich.myarena()
timer.Create("fx_myarena", 1, 6, function()
surface.PlaySound("ambient/explosions/explode_3.wav")
local pos = Vector(2727.877686, -1700.273682, 109.490601)
local effectdata = EffectData()
effectdata:SetOrigin(pos)
effectdata:SetMagnitude(2)
effectdata:SetScale(1)
effectdata:SetRadius(5)
util.Effect("HelicopterMegaBomb", effectdata)
end)
end
concommand.Add("fx_test", function()
kostich.myarena()
end)
if not file.Exists("mmk_img", "DATA") then
file.CreateDir("mmk_img")
end
local MatCache = {}
local DownloadQueue = {}
local function GetPosterMat(url)
if MatCache[url] then return MatCache[url] end
local crc = util.CRC(url)
local path = "mmk_img/" .. crc .. ".png"
if file.Exists(path, "DATA") then
local mat = Material("../data/" .. path, "noclamp smooth")
MatCache[url] = mat
return mat
end
if not DownloadQueue[url] then
DownloadQueue[url] = true
http.Fetch(url, function(body, len, headers, code)
if code ~= 200 then return end
file.Write(path, body)
DownloadQueue[url] = nil
end, function(err)
print("[Poster Error] Failed to load: " .. url)
print(err)
DownloadQueue[url] = nil
end)
end
return nil
end
local peekDist = 400 * 400
hook.Add("PostDrawTranslucentRenderables", "DrawPostersMMK", function(bDepth, bSkybox)
if bSkybox then return end
for _, data in ipairs(agits) do
if (not data.show or string.find(kostich.getValue("posters"):lower(), data.show) and (data.pos:DistToSqr(LocalPlayer():GetPos()) <= peekDist) or MQS.CCam) then
local mat = GetPosterMat(data.url)
local scale = data.scale or 0.1
cam.Start3D2D(data.pos, data.ang, scale)
if mat then
surface.SetDrawColor(255, 255, 255, 255)
surface.SetMaterial(mat)
surface.DrawTexturedRect(0, 0, data.width, data.height)
else
surface.SetDrawColor(30, 30, 30, 200)
surface.DrawRect(0, 0, data.width, data.height)
draw.SimpleText("Загрузка...", "DermaLarge", data.width / 2, data.height / 2, color_white,
TEXT_ALIGN_CENTER,
TEXT_ALIGN_CENTER)
end
cam.End3D2D()
end
end
end)
concommand.Add("p_getpos", function()
local ply = LocalPlayer()
if not IsValid(ply) then return end
local pos = ply:GetPos()
local code = string.format("Vector(%.2f, %.2f, %.2f)", pos.x, pos.y, pos.z)
SetClipboardText(code)
chat.AddText(Color(100, 255, 100), "[Cpy] ", color_white, "Позиция скопирована: ", Color(200, 200, 0), code)
end)
concommand.Add("p_getang", function()
local ply = LocalPlayer()
if not IsValid(ply) then return end
local ang = ply:EyeAngles()
local code = string.format("Angle(%.2f, %.2f, %.2f)", ang.p, ang.y, ang.r)
SetClipboardText(code)
chat.AddText(Color(100, 255, 100), "[Cpy] ", color_white, "Угол скопирован: ", Color(200, 200, 0), code)
end)
-- function kostich.menu_pasting()
-- local stat
-- sound.PlayFile("sound/ambient/machines/combine_terminal_loop1.wav", "noplay", function(station, errCode, errStr)
-- if IsValid(station) then
-- station:Play()
-- station:SetVolume(0.3)
-- stat = station
-- end
-- end)
-- local code_lines = {
-- {
-- correct = 2,
-- variants = {
-- "local frame = vgui.Destroy('DFrame')",
-- "local frame = vgui.Create('DFrame')",
-- "dim frame as new Window()",
-- "function frame:Create()"
-- }
-- },
-- {
-- correct = 1,
-- variants = {
-- "frame:SetSize(500, 400)",
-- "frame.width = 500; frame.height = 400",
-- "frame:Resize_Window(500, 400)",
-- "SetSize(frame, 500, 400)"
-- }
-- },
-- {
-- correct = 3,
-- variants = {
-- "frame.center()",
-- "frame:Align('center')",
-- "frame:Center()",
-- "util.Center(frame)"
-- }
-- },
-- {
-- correct = 2,
-- variants = {
-- "frame:ShowCloseButton(false)",
-- "frame:MakePopup()",
-- "frame:EnableMouse()",
-- "input.EnableCursor()"
-- }
-- },
-- {
-- correct = 4,
-- variants = {
-- "paint(function(w,h) end)",
-- "frame.Paint = new function()",
-- "hook.Add('Paint', frame)",
-- "frame.Paint = function(s, w, h)"
-- }
-- },
-- {
-- correct = 1,
-- variants = {
-- " draw.RoundedBox(0, 0, 0, w, h, Color(40, 0, 60))",
-- " surface.DrawRect(red, 0, 0, w, h)",
-- " draw.Box(0, 0, w, h, purple)",
-- " render.Clear(40, 0, 60)"
-- }
-- },
-- {
-- correct = 3,
-- variants = {
-- "end function",
-- "return true",
-- "end",
-- "}"
-- }
-- }
-- }
-- for k, v in ipairs(code_lines) do
-- v.current = math.random(1, #v.variants)
-- if v.current == v.correct then
-- v.current = (v.current % #v.variants) + 1
-- end
-- end
-- local win = vgui.Create("DFrame")
-- win:SetTitle("VSCode - purple_menu.lua [READ ONLY - CLICK TO PATCH]")
-- win:SetSize(ScrW(), ScrH())
-- win:Center()
-- win:MakePopup()
-- win:ShowCloseButton(true)
-- win:SetDraggable(false)
-- local colBG = Color(30, 30, 35)
-- local colSidebar = Color(25, 25, 30)
-- local colLineNum = Color(100, 100, 120)
-- local colHighlight = Color(45, 40, 50)
-- local colFunc = Color(200, 100, 255)
-- local colStr = Color(150, 255, 150)
-- local colErr = Color(255, 100, 100)
-- local colNorm = Color(220, 220, 220)
-- local lineHeight = 40
-- local startY = 100
-- local isWin = false
-- win.OnClose = function()
-- if IsValid(stat) then stat:Stop() end
-- end
-- local consoleStatus = "ERROR: Syntax error in line 1..."
-- local consoleCol = colErr
-- local function CheckWin()
-- local errors = 0
-- local firstErrorLine = -1
-- for k, v in ipairs(code_lines) do
-- if v.current ~= v.correct then
-- errors = errors + 1
-- if firstErrorLine == -1 then firstErrorLine = k end
-- end
-- end
-- if errors == 0 then
-- isWin = true
-- consoleStatus = "SUCCESS: 0 Errors, 0 Warnings. Compiling..."
-- consoleCol = Color(0, 255, 0)
-- surface.PlaySound("buttons/button14.wav")
-- timer.Simple(1.5, function()
-- if IsValid(win) then
-- surface.PlaySound("ambient/levels/labs/electric_explosion1.wav")
-- LocalPlayer():ScreenFade(SCREENFADE.IN, Color(0, 0, 0, 255), 0.3, 0)
-- timer.Simple(0.3, function()
-- cur_params["hud"] = "kostich"
-- save_settings()
-- chat.AddText(red, "[ИВЕНТ] ", color_white, "В сборку вернулся худ от сапа")
-- end)
-- RunConsoleCommand("success_menu")
-- win:Close()
-- end
-- end)
-- else
-- consoleStatus = "COMPILER ERROR: Unexpected symbol near line " .. firstErrorLine
-- consoleCol = colErr
-- end
-- end
-- win.Paint = function(s, w, h)
-- draw.RoundedBox(0, 0, 0, w, h, colBG)
-- draw.RoundedBox(0, 0, 0, 60, h, colSidebar)
-- draw.SimpleText("LUA DEBUGGER", "DermaLarge", 80, 20, Color(200, 100, 255))
-- draw.SimpleText("Нажмите на строку с ошибкой, чтобы исправить код.", "DermaDefault", 80, 55, Color(150, 150, 150))
-- draw.RoundedBox(0, 0, h - 40, w, 40, Color(20, 20, 20))
-- draw.SimpleText("> " .. consoleStatus, "DermaDefaultBold", 10, h - 28, consoleCol)
-- end
-- for i, lineData in ipairs(code_lines) do
-- local btn = vgui.Create("DButton", win)
-- btn:SetPos(60, startY + (i - 1) * lineHeight)
-- btn:SetSize(win:GetWide() - 60, lineHeight)
-- btn:SetText("")
-- btn.Paint = function(s, w, h)
-- if s:IsHovered() and not isWin then
-- draw.RoundedBox(0, 0, 0, w, h, colHighlight)
-- end
-- local text = lineData.variants[lineData.current]
-- local isCorrect = (lineData.current == lineData.correct)
-- local txtCol = colNorm
-- if isWin then
-- txtCol = Color(100, 255, 100)
-- elseif isCorrect then
-- txtCol = colFunc
-- else
-- txtCol = Color(255, 100, 100)
-- end
-- draw.SimpleText(text, "DermaLarge", 20, h / 2, txtCol, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER)
-- surface.SetTextColor(colLineNum)
-- surface.SetFont("DermaLarge")
-- surface.SetTextPos(-40, h / 2 - 10)
-- surface.DrawText(tostring(i))
-- end
-- btn.DoClick = function()
-- if isWin then return end
-- lineData.current = lineData.current + 1
-- if lineData.current > #lineData.variants then
-- lineData.current = 1
-- end
-- surface.PlaySound("buttons/lightswitch2.wav")
-- CheckWin()
-- end
-- end
-- CheckWin()
-- end
function kostich.deploy_game()
local music
sound.PlayFile("sound/pavetr_mmk/music/Sugraal&Pavetr-Sup_Paster.mp3", "noplay", function(station, err, str)
if IsValid(station) then
station:Play()
station:SetVolume(1.5)
music = station
end
end)
local function RestartGame()
surface.PlaySound("buttons/button10.wav")
chat.AddText(Color(255, 50, 50), "[SFTP] ", color_white,
"ОШИБКА: Вам афродетка сервак ебет хеппи мил бекдуром! Экстренное отключение...")
local owner = vgui.GetWorldPanel()
for _, child in ipairs(owner:GetChildren()) do
if child.IsDeployGame then child:Close() end
end
timer.Simple(1.5, function() kostich.deploy_game() end)
end
local files = {
{ name = "init.lua", type = "lua", size = "12 KB", bad = false },
{ name = "cl_init.lua", type = "lua", size = "24 KB", bad = false },
{ name = "shared.lua", type = "lua", size = "5 KB", bad = false },
{ name = "sv_db.lua", type = "lua", size = "8 KB", bad = false },
{ name = "config.lua", type = "lua", size = "2 KB", bad = false },
{ name = "brush_decompile.exe", type = "exe", size = "5 MB", bad = true },
{ name = "happy_meal_backdoor.dll", type = "dll", size = "1 MB", bad = true },
{ name = "utils.lua", type = "lua", size = "4 KB", bad = false },
}
local needed = 0
for _, f in ipairs(files) do if not f.bad then needed = needed + 1 end end
local current = 0
local win = vgui.Create("DFrame")
win:SetTitle("WinSCP")
win:SetSize(900, 600)
win:Center()
win:MakePopup()
win.IsDeployGame = true
win:ShowCloseButton(true)
win.Paint = function(s, w, h)
draw.RoundedBox(0, 0, 0, w, h, Color(30, 30, 35))
draw.RoundedBox(0, 0, 0, w, 25, Color(60, 0, 90))
draw.RoundedBox(0, 0, h - 30, w, 30, Color(20, 20, 20))
draw.SimpleText("PENDING: " .. (needed - current) .. " files", "DermaDefault", 10, h - 22, Color(150, 150, 150))
end
win.OnClose = function()
if IsValid(music) then
music:Stop()
end
end
local function CreatePanel(parent, title, x, colHeader)
local p = vgui.Create("DPanel", parent)
p:SetPos(x, 40)
p:SetSize(440, 520)
p.Paint = function(s, w, h)
draw.RoundedBox(0, 0, 0, w, h, Color(40, 40, 45))
draw.RoundedBox(0, 0, 0, w, 30, colHeader)
draw.SimpleText(title, "DermaDefaultBold", 10, 8, color_white)
end
local scroll = vgui.Create("DScrollPanel", p)
scroll:Dock(FILL)
scroll:DockMargin(5, 35, 5, 5)
local layout = vgui.Create("DIconLayout", scroll)
layout:Dock(FILL)
layout:SetSpaceY(5)
return layout
end
local leftLayout = CreatePanel(win, "LOCAL DISK (Click to Upload)", 5, Color(70, 70, 80))
local rightLayout = CreatePanel(win, "REMOTE SERVER", 455, Color(0, 100, 50))
for _, f in ipairs(files) do
local btn = leftLayout:Add("DButton")
btn:SetSize(420, 40)
btn:SetText("")
btn.IsUploading = false
btn.Progress = 0
btn.UploadSpeed = 0
btn.IsUploaded = false
btn.DoClick = function(s)
if s.IsUploaded or s.IsUploading then return end
if f.bad then
RestartGame()
return
end
surface.PlaySound("buttons/button17.wav")
s.IsUploading = true
s.StartTime = CurTime()
s.Duration = math.Rand(0.5, 1.5)
end
btn.Think = function(s)
if s.IsUploading then
local fraction = (CurTime() - s.StartTime) / s.Duration
s.Progress = math.Clamp(fraction, 0, 1)
if fraction >= 1 then
s.IsUploading = false
s.IsUploaded = true
s:SetParent(rightLayout)
s:Dock(TOP)
leftLayout:InvalidateLayout()
rightLayout:InvalidateLayout()
surface.PlaySound("buttons/combine_button7.wav")
current = current + 1
if current >= needed then
surface.PlaySound("buttons/button14.wav")
chat.AddText(Color(0, 255, 0), "[SFTP] ", color_white, "ПЛИБ ЗАЛИТ!")
surface.PlaySound("ambient/levels/labs/electric_explosion1.wav")
LocalPlayer():ScreenFade(SCREENFADE.IN, Color(0, 0, 0, 255), 0.3, 0)
timer.Simple(0.3, function()
cur_params["plib"] = true
save_settings()
chat.AddText(red, "[ИВЕНТ] ", color_white, "В сборку вернулся plib")
end)
RunConsoleCommand("success_plib")
win:Close()
end
end
end
end
btn.Paint = function(s, w, h)
local col = Color(60, 60, 65)
if s.IsUploaded then col = Color(30, 60, 30) end
draw.RoundedBox(4, 0, 0, w, h, col)
if s.IsUploading then
draw.RoundedBox(4, 0, 0, w * s.Progress, h, Color(0, 200, 255, 50))
draw.RoundedBox(0, 0, h - 2, w * s.Progress, 2, Color(0, 255, 255))
end
local iconCol = Color(100, 200, 255)
if f.bad then iconCol = Color(255, 100, 100) end
draw.RoundedBox(0, 10, 10, 20, 20, iconCol)
draw.SimpleText(f.name, "DermaDefaultBold", 40, 12, color_white)
if s.IsUploading then
local pct = math.Round(s.Progress * 100)
draw.SimpleText(pct .. "%", "DermaDefaultBold", w - 50, 12, Color(0, 255, 255))
elseif s.IsUploaded then
draw.SimpleText("OK", "DermaDefaultBold", w - 40, 12, Color(100, 255, 100))
else
draw.SimpleText(f.size, "DermaDefault", w - 50, 12, Color(150, 150, 150))
if s:IsHovered() then
draw.SimpleText("UPLOAD", "DermaDefaultBold", w - 110, 12, Color(0, 255, 255))
end
end
end
end
end
function kostich.titles()
local credits = {
{ type = "gap", val = 100 },
{ type = "header", val = "МЕРТВАЯ МАМА КОСТ ИЧА РП" },
{ type = "text", val = "Ивент 'Сенвай украл сапы'" },
{ type = "gap", val = 50 },
{ type = "header", val = "РАЗРАБОТЧИКИ" },
{ type = "text", val = "Pavetr" },
{ type = "text", val = "Encoded - мини-игра про менюшки" },
{ type = "text", val = "MacTavish - пиздец забагованные McQuests+SimpleNPCs" },
{ type = "gap", val = 30 },
{ type = "header", val = "САУНД ДИЗАЙНЕРЫ" },
{ type = "text", val = "Marlya" },
{ type = "text", val = "Pavetr" },
{ type = "gap", val = 30 },
{ type = "header", val = "ОЗВУЧКА" },
{ type = "text", val = "Encoded" },
{ type = "text", val = "Spawncode" },
{ type = "text", val = "Caramelka" },
{ type = "text", val = "Rayz" },
{ type = "text", val = "Applio RVC - Urbanichka, Кост Ич" },
{ type = "text", val = "ElevenLabs - Остальные голоса" },
{ type = "gap", val = 30 },
{ type = "header", val = "ИВЕНТ ПОСВЯЩАЕТСЯ" },
{ type = "text", val = "Shiten (uxcx) - его недавно забрали в ВСРФ" },
{ type = "text", val = "Senwai" },
{ type = "text", val = "Vegaban" },
{ type = "text", val = "Sugraal" },
{ type = "text", val = "Кост Ич (aka @PIXO1166)" },
{ type = "gap", val = 30 },
{ type = "image", val = base_url .. "gmod.png", height = 300 },
{ type = "text", val = "Powered by Garry's Mod" },
{ type = "gap", val = 60 },
{ type = "header", val = "ОТДЕЛЬНАЯ БЛАГОДАРНОСТЬ" },
{ type = "text", val = "Jock" },
{ type = "text", val = "Inferno" },
{ type = "text", val = "Spawncode" },
{ type = "text", val = "Spac3e" },
{ type = "gap", val = 30 },
{ type = "header", val = "ВЫРАЖАЮ БЛАГОДАРНОСТЬ ВСЕМ" },
{ type = "text", val = "упомянутым в сюжетке персонажам" },
{ type = "gap", val = 30 },
{ type = "header", val = "СПАСИБО ЗА ИГРУ" },
{ type = "text", val = "Заходите на pavetr.ru/ds чтобы не пропустить подобные ивенты" },
{ type = "gap", val = ScrH() * 0.4 },
{ type = "image", val = base_url .. "senwai_out.png", height = 300 },
{ type = "gap", val = 30 }
}
local music
sound.PlayFile("sound/pavetr_mmk/music/Marlya-My_Kirik_Luk.mp3", "noplay", function(station, err, str)
if IsValid(station) then
station:Play()
station:SetVolume(3)
music = station
end
end)
local pnl = vgui.Create("DPanel")
pnl:SetSize(ScrW(), ScrH())
pnl:MakePopup()
pnl:SetKeyboardInputEnabled(true)
pnl.OnKeyCodePressed = function() end
gui.EnableScreenClicker(true)
local scrollY = ScrH()
local contentHeight = 0
local baseSpeed = 50
local fastSpeed = 400
local currentSpeed = baseSpeed
local container = vgui.Create("DPanel", pnl)
container:SetWide(ScrW() * 0.6)
container:SetPos(ScrW() * 0.2, scrollY)
container.Paint = function() end
local yCursor = 0
for _, item in ipairs(credits) do
if item.type == "header" then
local lbl = vgui.Create("DLabel", container)
lbl:SetFont("ui.40")
lbl:SetText(item.val)
lbl:SetTextColor(Color(0, 255, 255))
lbl:SizeToContents()
lbl:SetPos((container:GetWide() - lbl:GetWide()) / 2, yCursor)
yCursor = yCursor + 50
elseif item.type == "text" then
local lbl = vgui.Create("DLabel", container)
lbl:SetFont("ui.30")
lbl:SetText(item.val)
lbl:SetTextColor(Color(200, 200, 200))
lbl:SizeToContents()
lbl:SetPos((container:GetWide() - lbl:GetWide()) / 2, yCursor)
yCursor = yCursor + 30
elseif item.type == "image" then
local img = vgui.Create("DHTML", container)
local h = item.height or 200
local w = h * 1.77
img:SetSize(w, h)
img:SetPos((container:GetWide() - w) / 2, yCursor)
img:SetHTML([[<body style="margin:0;padding:0;overflow:hidden;background:transparent;"><img src="]] ..
item.val .. [[" style="width:100%;height:100%;object-fit:contain;"></body>]])
img:SetMouseInputEnabled(false)
yCursor = yCursor + h + 20
elseif item.type == "gap" then
yCursor = yCursor + item.val
end
end
container:SetTall(yCursor)
contentHeight = yCursor
pnl.Paint = function(s, w, h)
surface.SetDrawColor(0, 0, 0, 255)
surface.DrawRect(0, 0, w, h)
if math.random() > 0.95 then
surface.SetDrawColor(255, 0, 0, 5)
surface.DrawRect(0, math.random(0, h), w, 2)
end
local targetSpeed = baseSpeed
if input.IsKeyDown(KEY_SPACE) or input.IsMouseDown(MOUSE_LEFT) then
targetSpeed = fastSpeed
draw.SimpleText(">>", "DermaLarge", w - 50, h - 50,
Color(255, 50, 50, math.abs(math.sin(CurTime() * 10) * 255)))
end
currentSpeed = Lerp(FrameTime() * 5, currentSpeed, targetSpeed)
scrollY = scrollY - (currentSpeed * FrameTime())
container:SetPos(ScrW() * 0.2, scrollY)
if scrollY + contentHeight < 0 then
if IsValid(music) then
music:Stop()
end
s:Remove()
gui.EnableScreenClicker(false)
chat.AddText(Color(0, 255, 0), "Спасибо за прохождение сюжетки ММК РП!")
end
end
end
-- Miha Cheater
do
local createFont = surface.CreateFont
createFont('quest.title', {
font = 'Roboto Medium',
size = 24,
weight = 500
})
end
local function mat(name)
return Material('eui_quest/' .. name .. '.png')
end
local ELEMENTS = {
{
icon = mat('Frame 1169754813'),
size = { 1497, 877 },
pos = { 98, 249 },
correctPos = { 500, 250 },
mul = 4,
placed = false,
},
{
icon = mat('Group 37086'),
size = { 369, 155 },
pos = { 120, 259 },
correctPos = { 800, 250 },
placed = false,
},
{
icon = mat('Frame 1169754810'),
size = { 701, 70 },
pos = { 540, 319 },
correctPos = { 1100, 300 },
placed = false,
},
{
icon = mat('Bar'),
size = { 738, 367 },
pos = { 230, 450 },
correctPos = { 600, 450 },
placed = false,
},
{
icon = mat('Frame 1169754811'),
size = { 46, 352 },
pos = { 140, 450 },
correctPos = { 750, 500 },
placed = false,
},
{
icon = mat('Button'),
size = { 435, 206 },
pos = { 230, 810 },
correctPos = { 900, 750 },
placed = false,
},
{
icon = mat('Frame 1169754812'),
size = { 727, 744 },
pos = { 930, 300 },
correctPos = { 1050, 350 },
placed = false,
},
{
icon = mat('CLOSE'),
size = { 120, 50 },
pos = { 1350, 329 },
correctPos = { 1200, 350 },
placed = false,
},
}
local backgroundColor = Color(15, 11, 19)
local secondaryColor = Color(30, 24, 37)
local accentColor = Color(59, 32, 59)
local RNDX = RNDX
local rect = RNDX.Draw
local BOX_ROUNDED = 16
local PANEL = {}
function PANEL:Init()
self.startTime = CurTime()
sound.PlayFile("sound/pavetr_mmk/music/Pavetr-Chelyabinskii_Central_vol2.mp3", "noplay", function(station, err, str)
if IsValid(station) then
station:Play()
station:SetVolume(3)
self.music = station
end
end)
self:AddHeader()
self:AddContainer()
self:AddElements()
self:AddZones()
end
function PANEL:AddHeader()
local header = self:Add('Panel')
header:Dock(TOP)
header:SetTall(64)
function header:Paint(w, h)
rect(BOX_ROUNDED, 0, 0, w, h, secondaryColor, RNDX.NO_BL + RNDX.NO_BR)
end
local title = header:Add('DLabel')
title:Dock(LEFT)
title:DockMargin(10, 0, 0, 0)
title:SetText('PURPLE QUEST')
-- title:SetContentAlignment(5)
title:SetFont('quest.title')
title:SizeToContentsX()
local close = header:Add('DButton')
close:Dock(RIGHT)
close:DockMargin(0, 10, 10, 10)
close:SetText('')
close:SetWide(44)
close.scale = 1
function close:Paint(w, h)
local matrix = Matrix()
local x, y = self:LocalToScreen(w / 2, h / 2)
local center = Vector(x, y)
local isHovered = self:IsHovered()
self.scale = Lerp(FrameTime() * 8, self.scale, isHovered and 1.05 or 1)
matrix:Translate(center)
matrix:Scale(Vector(1, 1, 0) * self.scale)
matrix:Translate(-center)
cam.PushModelMatrix(matrix)
rect(BOX_ROUNDED / 2, 0, 0, w, h, accentColor)
draw.SimpleText('', 'quest.title', w / 2, h / 2, color_white, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
cam.PopModelMatrix()
end
local frame = self
function close:DoClick()
if frame.music then
frame.music:Stop()
end
frame:Remove()
end
end
function PANEL:AddContainer()
local container = self:Add('Panel')
container:Dock(FILL)
self.container = container
end
function PANEL:AddElements()
local container = self.container
local side = container:Add('DScrollPanel')
side:Dock(LEFT)
side:DockPadding(10, 0, 0, 0)
side:SetWide(460)
side.VBar:SetHideButtons(true)
side.VBar.Paint = nil
side.VBar.btnGrip.Paint = nil
function side:Paint(w, h)
rect(BOX_ROUNDED, 0, 0, w, h, secondaryColor, RNDX.NO_TL + RNDX.NO_TR + RNDX.NO_BR)
end
for i, currentElement in RandomPairs(ELEMENTS) do
local size = currentElement.size
local mul = currentElement.mul or 2
local sizeW, sizeH = size[1] / mul, size[2] / mul
local element = side:Add('DPanel')
element:Dock(TOP)
element:DockMargin(0, 0, 0, 8)
element:SetTall(sizeH)
element:Droppable('purple-menu')
element:SetCursor('hand')
element.i = i
element.scale = 1
function element:Paint(w, h)
local matrix = Matrix()
local x, y = self:LocalToScreen(w / 2, h / 2)
local center = Vector(x, y)
local isHovered = self:IsHovered()
self.scale = Lerp(FrameTime() * 8, self.scale, isHovered and 1.05 or 1)
matrix:Translate(center)
matrix:Scale(Vector(1, 1, 0) * self.scale)
matrix:Translate(-center)
cam.PushModelMatrix(matrix)
surface.SetMaterial(currentElement.icon)
surface.SetDrawColor(255, 255, 255, 255)
surface.DrawTexturedRect(w / 2 - sizeW / 2, 0, sizeW, sizeH)
cam.PopModelMatrix()
end
end
end
function PANEL:AddZones()
local fr = self
local list = self.container:Add('Panel')
list:Dock(FILL)
list:DockMargin(10, 10, 0, 0)
local currentElements = 1
local zonePanles = {}
for i = 1, 8 do
local element = ELEMENTS[i]
local icon = element.icon
local size = element.size
local sizeW, sizeH = size[1] / 2, size[2] / 2
local pos = element.pos
local posX, posY = pos[1] / 2, pos[2] / 2
local zone = list:Add('DPanel')
zone:SetSize(sizeW, sizeH)
zone:SetPos(posX, posY)
if i ~= 1 then
zone:SetVisible(false)
end
zone.startTime = CurTime()
function zone:Paint(w, h)
local matrix = Matrix()
local startTime = self.startTime
local timeElapsed = (CurTime() - startTime) * 4
local value = math.sin(timeElapsed) * 0.5 + 0.5
local currentAlpha = Lerp(value, 0.5, 1)
local mul = self.placed and 1 or currentAlpha
cam.PushModelMatrix(matrix)
surface.SetMaterial(icon)
surface.SetDrawColor(255 * mul, 255 * mul, 255 * mul, self.placed and 255 or 50)
surface.DrawTexturedRect(w / 2 - sizeW / 2, 0, sizeW, sizeH)
cam.PopModelMatrix()
end
zone:Receiver('purple-menu', function(self, panels, dropped)
if not dropped then return end
local firstPanel = panels[1]
if firstPanel.i == i and not self.placed and currentElements == firstPanel.i then
self.placed = true
currentElements = currentElements + 1
local nextPanel = zonePanles[currentElements]
if nextPanel then
nextPanel:SetVisible(true)
end
if currentElements == (#ELEMENTS + 1) then
if fr.music then
fr.music:Stop()
end
surface.PlaySound("ambient/levels/labs/electric_explosion1.wav")
LocalPlayer():ScreenFade(SCREENFADE.IN, Color(0, 0, 0, 255), 0.3, 0)
timer.Simple(0.3, function()
cur_params["hud"] = "kostich"
save_settings()
chat.AddText(red, "[ИВЕНТ] ", color_white, "В сборку вернулся худ от сапа")
end)
RunConsoleCommand("success_menu")
fr:Remove()
end
end
end)
zonePanles[i] = zone
end
end
do
local colorAlpha = ColorAlpha(accentColor, 255)
function PANEL:Paint(w, h)
local startTime = self.startTime
local timeElapsed = CurTime() - startTime
local value = math.sin(timeElapsed) * 0.5 + 0.5
local currentAlpha = Lerp(value, 0.5, 1)
colorAlpha = ColorAlpha(colorAlpha, 255 * currentAlpha)
RNDX().Rect(0, 0, w, h)
:Color(colorAlpha)
:Shadow(20, 20)
:Rad(BOX_ROUNDED)
:Draw()
rect(BOX_ROUNDED, 0, 0, w, h, backgroundColor)
end
end
vgui.Register('quest.purpleMenu', PANEL, 'EditablePanel')
function kostich.menu_pasting()
local menu = vgui.Create('quest.purpleMenu')
menu:SetSize(1300, 800)
menu:Center()
menu:MakePopup()
end
concommand.Add("play_menu", function()
kostich.menu_pasting()
end)
concommand.Add("play_plib", function()
kostich.deploy_game()
end)
concommand.Add("play_bank", function()
kostich.bank_game()
end)
concommand.Add("show_titles", function()
kostich.titles()
end)
local vol = 4
net.Receive("pavetr.sendSound", function(_, ply)
local snd = net.ReadString()
sound.PlayFile(snd, "noplay", function(station, errCode, errStr)
if (IsValid(station)) then
station:Play()
station:SetVolume(vol)
else
print("[QuestSay] Error playing sound", snd, errCode, errStr)
end
end)
end)
local highlight = Color(0, 155, 255)
local delay = 60 * 5
local msgs = {
{ highlight, "[MMK] ", color_white, "Правила и информация о персонажах находятся в ", highlight, "F4->Вики" },
{ highlight, "[MMK] ", color_white, "Нет озвучки или музыки? Скачайте контент по инструкции в ", highlight, "F4->Вики" },
{ highlight, "[MMK] ", color_white, "Заходите на ", highlight, "pavetr.ru/ds ", color_white, "чтобы не пропустить новые ивенты" },
{ highlight, "[MMK] ", color_white, "Вы можете покупать хилки и броню в ", highlight, "F4->Магазин" },
}
timer.Create("chat_msg", delay, 0, function()
local msg = msgs[math.random(#msgs)]
chat.AddText(unpack(msg))
end)