Quick actions

cmd+k|ctrl+k

Navigation

Languages

improved video player

Snippet info

Language

Lua

Visibility

public

Author

typicaalusername

Created

2024-08-19T18:58:15.113635Z

Updated

2024-09-20T02:05:33.379743Z

local VideoCollection = loadstring(game:GetService("HttpService"):GetAsync("https://glot.io/snippets/gur7rc9dq6/raw/data.lua",true))()
local args = {...}
local ChosenVideo = VideoCollection[args[1]]
local horizontal = ChosenVideo.horizontal
local frames = ChosenVideo.frames
local fps = ChosenVideo.fps

local Main = Instance.new("Part",script)
Main.Anchored = true
Main.Transparency = 0
Main.Size = (not horizontal and Vector3.new(6.6, 14.031, 0.096) or Vector3.new(18.3, 10.831, 0.096))
Main.CFrame = owner.Character.HumanoidRootPart.CFrame * CFrame.new(0,5,-5) * CFrame.Angles(0,math.rad(180),0)

local Surface = Instance.new("SurfaceGui",Main)
local PrimaryFrame = Instance.new("Frame",Surface)
PrimaryFrame.ClipsDescendants = true
PrimaryFrame.BackgroundTransparency = 1
PrimaryFrame.Size = UDim2.fromScale(1, 1)
PrimaryFrame.AnchorPoint = Vector2.one*.5
PrimaryFrame.Position = UDim2.fromScale(.5, .5)

local Configuration = {
	framerate = fps;
	currentInfo = nil;
	currentFrame = 0;
	absoluteTotal = 0;
	currentImage = nil;
	atFrame = 0;
	infoNumber = 0;
}

local function preload(id)
	local id = id
	if type(id) == string then
		id = {id}
	end
	game:GetService("ContentProvider"):PreloadAsync(id,function(id,assetfetchstatus)
		if assetfetchstatus == Enum.AssetFetchStatus.Success then
			print(`Preloaded {id}.`)
		else
			task.spawn(warn,`Preloading of {id} failed.`)
		end
	end)
end

local toLoad = {}

for i,v in frames do
	Configuration.absoluteTotal+=v.Frames
	toLoad[i] = `rbxassetid://{v.Id}`
end

preload(toLoad)

local Audio = Instance.new("Sound",Main)
local CurrentAudioSegment = 1
local Audios = ChosenVideo.audios
local AudioSpeeds = ChosenVideo.audioSpeeds
local TimePosition = 0

Audio.Volume = 5
Audio.SoundId = "rbxassetid://"..Audios[CurrentAudioSegment]
Audio.PlaybackSpeed = (typeof(AudioSpeeds) == "table" and AudioSpeeds[1] or AudioSpeeds)
Audio:Play()

Audio.Ended:Connect(function()
	CurrentAudioSegment = (CurrentAudioSegment == #Audios and 1 or CurrentAudioSegment+1)
	if typeof(audioSpeeds) == "table" then
		if audioSpeeds[CurrentAudioSegment] then
			Audio.PlaybackSpeed = AudioSpeeds[CurrentAudioSegment]
		else
			Audio.PlaybackSpeed = 1
		end
	elseif typeof(audioSpeeds) == "number" then
		Audio.PlaybackSpeed = audioSpeeds
	end
	Configuration.currentFrame = 0
	TimePosition = 0
	warn("_Sound has ended. Now heading to the next segment.")
	Audio.SoundId = "rbxassetid://"..Audios[CurrentAudioSegment]
	Audio.PlaybackSpeed = (typeof(AudioSpeeds) == "table" and AudioSpeeds[1] or AudioSpeeds)
	Audio:Play()
end)

local sync = false
local sync1 = false

local duration = Configuration.absoluteTotal / Configuration.framerate

local r1 = duration / Configuration.absoluteTotal
local r2 = r1 * Configuration.currentFrame
local tp = r2 * Audio.PlaybackSpeed

game:GetService("RunService").Heartbeat:connect(function()
	if sync == true then
		sync = false
		sync1 = true

		coroutine.wrap(function()
			Audio.TimePosition = 0
			Audio.TimePosition = tp + task.wait()
		end)()

		sync1 = false
	end
end)

local function create(data)
	if Configuration.infoNumber + 1 > #frames then
		Configuration.infoNumber = 0
		PrimaryFrame:ClearAllChildren()
	end
	pcall(game.Destroy,Configuration.currentImage)
	Configuration.infoNumber+=1
	Configuration.currentInfo = data
	Configuration.atFrame = 1

	local Image = Instance.new("ImageLabel", PrimaryFrame)
	Image.BackgroundTransparency = 1
	Image.Size = UDim2.new(data.Columns, 0, data.Rows, 0)
	Image.Position = UDim2.new(.5, 0, .5, 0)
	Image.Image = `rbxassetid://{data.Id}`

	Configuration.currentImage = Image
end

create(frames[Configuration.infoNumber])

local currentTimer = 0
local stillRunningTask = false

owner.Chatted:Connect(function(v)
	if v:sub(1,5) == "-sync" then
		sync = true
	end
end)

game:GetService("Players").PlayerAdded:Connect(function(v)
	v.CharacterAdded:Once(function()
		sync = true
	end)
end)

local gabrgaeeeee = os.clock()
game:GetService("RunService").PostSimulation:Connect(function(DeltaTime)
	--if stillRunningTask then return end
	--stillRunningTask = true

	currentTimer+=DeltaTime
	local framerategarbage = (1/Configuration.framerate)

	if os.clock() - gabrgaeeeee >= framerategarbage then
		currentTimer = 0
		gabrgaeeeee = os.clock()

		Configuration.currentFrame+=1
		local data = Configuration.currentInfo
		Configuration.atFrame = (Configuration.atFrame + 1 > data.Frames and create(frames[Configuration.infoNumber]) or Configuration.atFrame+1)

		local currentRow = 1
		local currentColumn = Configuration.atFrame

		--repeat
		if currentColumn > data.Columns then
			currentRow += 1
			currentColumn -= data.Columns
		end
		--	until not (currentColumn > data.Columns)

		Configuration.currentImage.Position = UDim2.new(-(currentColumn - 1), 0, -(currentRow - 1), 0)

		r1 = duration / Configuration.absoluteTotal
		r2 = r1 * Configuration.currentFrame
		tp = r2 * Audio.PlaybackSpeed

		if math.abs(Audio.TimePosition - tp) >= .15 then
			Audio.TimePosition = tp
		end
	end
	--	stillRunningTask = false
end)
INFO