Tasability 7.lua
Tasability 7.lua
By plusgiant5
Some code taken from original Replayability so credit to dong too
Tasability V1.2
Added custom JSON Encoder
Encoding and decoding can no longer freeze the game permanently (unless you set
MinimumJSONFPS to math.huge)
You can click on the PlaceId label to copy PlaceId
Bypassed some anti exploits
Added rejoin and invite commands
Command names are no longer case sensitive
A lot of small updates I forgot
-- Config
local PlaybackInputs = true -- Sets if you want replays to playback your inputs
when playing them (AHK connection is required for mouse scroll playback)
local PlaybackMouseLocation = false -- Sets if you want replays to move your mouse
when playing them (glitchy when loading checkpoints)
local RoundDigits = 3 -- Rounds all numbers when writing, to greatly decrease file
size (set to 50 to disable rounding)
local ReplayStartTime = 3 -- Number of seconds to wait before starting to read the
replay
local FrameBacktrackCount = 500 -- Number of frames to backtrack when frozen to see
which keys are currently pressed. Increase as much as your computer can handle
local MinimumJSONFPS = 1/10 -- Lowest you want your FPS to go while
encoding/decoding (higher = faster encoding/decoding, lower = better fps) 1/30: 30
fps, 1/60: 60 fps\
local BypassAntiExploit = false -- If this is true games with anti cheat (like
beans) will not kick you, but there is a chance animations will be broken
-- Advanced config
None = Color3.new(0,0,0);
}
-- End of config
-- Constants
local Version = "V1.2"
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local HttpService = game:GetService("HttpService")
local ContextActionService = game:GetService("ContextActionService")
local GuiService = game:GetService("GuiService")
local VirtualInputManager = game:GetService("VirtualInputManager")
local Player = game.Players.LocalPlayer
local Mouse = Player:GetMouse()
local random = math.random
local min = math.min
local max = math.max
local floor = math.floor
local ceil = math.ceil
local ReplayFileBeginning = "{\"Replay\":"
local ReplayFileEnding = "}"
local PlayerModule = Player.PlayerScripts:WaitForChild("PlayerModule")
local ShiftLockBoundKeys =
PlayerModule:WaitForChild("CameraModule"):WaitForChild("MouseLockController"):WaitF
orChild("BoundKeys")
local ShiftLockEnabled = false
local GuiInset = GuiService:GetGuiInset()
-- Variables
local ExecutionTick = tick()
local PlaceId = game.PlaceId
-- These will be set later --
local Character = nil
local Humanoid = nil
local RootPart = nil
local DefaultGravity = nil
local DefaultJumpPower = nil
local DefaultWalkSpeed = nil
local Resolution = nil
local ConsoleMessage = print
-----------------------------
local Reading = false
local Writing = false
local Saving = false
local AnimateDisabled = false
local Checkpoints = {}
local RenderSteppedConnections = {}
local SteppedConnections = {}
local FolderPath = "Tasability/"..tostring(PlaceId)
local ReplayPath = FolderPath.."/Replay.json"
local AHKConnectionFolderPath = "Replayability+_AHK"
local AHKConnectionRequestPath = "Replayability+_AHK/Request"
local ReplayTable = {} -- Should always be used instead of the json string except
when encoding or decoding
local RecordingTable = {} -- List of frames that will be added to ReplayTable if
recording is saved
local ReplayTableIndex = 0 -- The index in ReplayTable that will be read from
local AnimationQueue = {} -- Functions that were called by the animation script
(clear every frame)
local RunSpeed = 0 -- Set in the onRunning function, reset to 0 every frame
(AnimationId 2)
local ClimbSpeed = 0 -- Set in the onClimbing function, reset to 0 every frame
(AnimationId 4)
local HumanoidStateQueue = {} -- States that were activated on the humanoid (clear
every frame)
local InputBeganQueue = {} -- Inputs that have just began (for recording inputs)
(clear every frame)
local InputEndedQueue = {} -- Inputs that have just ended (for recording inputs)
(clear every frame)
local Cursor = Instance.new("ImageLabel") -- Fake cursor so the icon doesnt change
all the time
local CursorIcon = nil -- Icon of the cursor
local CursorSize = nil -- Size of the cursor
local CursorOffset = nil -- Offset of the cursor from
UserInputService:GetMouseLocation()
local Dead = false -- If the player is dead this is true
local CameraCFrame = workspace.CurrentCamera.CFrame -- Used when reading so that
nothing else can change the camera's CFrame
local Pressed = {} -- Current keys that are pressed
local IgnoreGameProcessed = false -- To ignore GameProcessed in InputBegan,
InputChanged, InputEnded
-- Tasability update
local Frozen = false
local FreezeFrame = 1 -- Frame to render while frozen
local SeekDirection = 0 -- Stays 0 normally, -1 when going backwards while frozen,
1 when going fowards
local SeekDirectionMultiplier = 1 -- To go faster or slower when seeking with R and
T
-- Converting inputs
-- To add to this table, use
https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
local InputCodes = {
["A"] = 0x41;
["B"] = 0x42;
["C"] = 0x43;
["D"] = 0x44;
["E"] = 0x45;
["F"] = 0x46;
["G"] = 0x47;
["H"] = 0x48;
["I"] = 0x49;
["J"] = 0x4A;
["K"] = 0x4B;
["L"] = 0x4C;
["M"] = 0x4D;
["N"] = 0x4E;
["O"] = 0x4F;
["P"] = 0x50;
["Q"] = 0x51;
["R"] = 0x52;
["S"] = 0x53;
["T"] = 0x54;
["U"] = 0x55;
["V"] = 0x56;
["W"] = 0x57;
["X"] = 0x58;
["Y"] = 0x59;
["Z"] = 0x5A;
["Space"] = 0x20;
["LeftShift"] = 0x10;
["RightShift"] = 0x10;
}
-- Compatibility
mouse1press = mouse1press or mouse1down
mouse2press = mouse2press or mouse2down
mouse1release = mouse1release or mouse1up
mouse2release = mouse2release or mouse2up
keypress = keypress or keydown
keyrelease = keyrelease or keyup
-- Other
local GUIParent = Player:WaitForChild("PlayerGui")
local json
do -- Overwriting JSON
json = (function()
--
-- json.lua
--
--
--
--
-- SOFTWARE.
--
local t = tick()
local currentstr
local lasti
lasti = lasti or i
if Type then
ConsoleMessage(Type.."coding...
("..tostring(i).."/"..tostring(#currentstr)..")")
end
game:GetService("RunService").Stepped:Wait()
t = tick()
lasti = i
end
end
end
-----------------------------------------------------
--------------------------
-- Encode
-----------------------------------------------------
--------------------------
local encode
local escape_char_map = {
[ "\\" ] = "\\",
[ "\"" ] = "\"",
[ "\b" ] = "b",
[ "\f" ] = "f",
[ "\n" ] = "n",
[ "\r" ] = "r",
[ "\t" ] = "t",
for k, v in pairs(escape_char_map) do
escape_char_map_inv[v] = k
end
end
return "null"
end
local function encode_table(val, stack)
local res = {}
stack = stack or {}
-- Circular reference?
stack[val] = true
local n = 0
for k in pairs(val) do
end
n = n + 1
end
if n ~= #val then
end
-- Encode
for i, v in ipairs(val) do
checkwait(i)
end
stack[val] = nil
return "[" .. table.concat(res, ",") ..
"]"
else
-- Treat as an object
local i = 0
for k, v in pairs(val) do
i = i + 1
end
checkwait(i)
table.insert(res, encode(k,
stack) .. ":" .. encode(v, stack))
end
stack[val] = nil
end
end
end
end
end
local type_func_map = {
[ "nil" ] = encode_nil,
[ "table" ] = encode_table,
[ "string" ] = encode_string,
[ "number" ] = encode_number,
[ "boolean" ] = tostring,
local t = type(val)
local f = type_func_map[t]
if f then
t = tick()
end
end
function json.encode(val)
currentstr = val
lasti = nil
return ( encode(val) )
end
-----------------------------------------------------
--------------------------
-- Decode
-----------------------------------------------------
--------------------------
local parse
local res = {}
end
return res
end
local literal_map = {
[ "true" ] = true,
[ "false" ] = false,
[ "null" ] = nil,
return i
end
end
return #str + 1
end
local line_count = 1
local col_count = 1
for i = 1, idx - 1 do
col_count = col_count + 1
line_count = line_count + 1
col_count = 1
end
end
end
-- http://scripts.sil.org/cms/scripts/page.php?
site_id=nrsi&id=iws-appendixa
local f = math.floor
return string.char(n)
end
end
-- Surrogate pair?
if n2 then
else
return codepoint_to_utf8(n1)
end
end
local j = i + 1
local k = j
local x = str:byte(j)
if x < 32 then
decode_error(str, j, "control
character in string")
elseif x == 92 then -- `\`: Escape
j = j + 1
local c = str:sub(j, j)
if c == "u" then
or str:match("^%x%x%x
%x", j + 1)
or decode_error(str, j -
1, "invalid unicode escape in string")
res = res ..
parse_unicode_escape(hex)
j = j + #hex
else
decode_error(str, j - 1,
"invalid escape char '" .. c .. "' in string")
end
res = res ..
escape_char_map_inv[c]
end
k = j + 1
return res, j + 1
end
j = j + 1
checkwait(i)
end
end
local s = str:sub(i, x - 1)
local n = tonumber(s)
if not n then
end
checkwait(i)
return n, x
end
end
checkwait(i)
return literal_map[word], x
end
local res = {}
local n = 1
i = i + 1
while 1 do
local x
i = i + 1
break
end
-- Read token
x, i = parse(str, i)
res[n] = x
n = n + 1
-- Next token
i = i + 1
checkwait(i)
end
return res, i
end
local res = {}
i = i + 1
while 1 do
i = i + 1
break
end
-- Read key
decode_error(str, i, "expected
string for key")
end
key, i = parse(str, i)
end
i = next_char(str, i + 1, space_chars,
true)
-- Read value
val, i = parse(str, i)
-- Set
res[key] = val
-- Next token
i = i + 1
--print(tick() - t, 1/60)
checkwait(i)
return res, i
end
local char_func_map = {
[ '"' ] = parse_string,
[ "0" ] = parse_number,
[ "1" ] = parse_number,
[ "2" ] = parse_number,
[ "3" ] = parse_number,
[ "4" ] = parse_number,
[ "5" ] = parse_number,
[ "6" ] = parse_number,
[ "7" ] = parse_number,
[ "8" ] = parse_number,
[ "9" ] = parse_number,
[ "-" ] = parse_number,
[ "t" ] = parse_literal,
[ "f" ] = parse_literal,
[ "n" ] = parse_literal,
[ "[" ] = parse_array,
[ "{" ] = parse_object,
local f = char_func_map[chr]
if f then
end
decode_error(str, idx, "unexpected character '"
.. chr .. "'")
end
function json.decode(str)
t = tick()
currentstr = str
lasti = nil
end
end
return res
end
return json
end)()
end
-- Functions
-- General Functions
local RandomString --RandomString() -> string
local RoundNumber -- RoundNumber(Number,Digits) -> number
local Vector3ToTable -- Vector3ToTable(Vector3) -> table
local TableToVector3 -- TableToVector3(Table) -> vector3
local CFrameToTable -- CFrameToTable(CFrame) -> table
local TableToCFrame -- TableToCFrame(Table) -> cframe
local RoundVector3 -- RoundVector3(Vector3,Digits) -> vector3
local RoundCFrame -- RoundCFrame(CFrame,Digits) -> cframe
local FindListIndex -- FindListIndex(Table,Search) -> number
local WaitForInput -- WaitForInput() -> nil
do
RandomString = function()
local str = ""
for _ = 1,random(1,20) do
local type = random(1,3)
if type == 1 then
str = str..string.char(random(97,122)) -- Lowercase
elseif type == 2 then
str = str..string.char(random(65,90)) -- Uppercase
elseif type == 3 then
str = str..string.char(random(48,57)) -- Numbers
end
end
return str
end
RoundNumber = function(Number,Digits)
local Mult = 10^max(tonumber(Digits) or 0,0)
return floor(Number*Mult+0.5)/Mult
end
Vector3ToTable = function(V3)
return {V3.X,V3.Y,V3.Z}
end
TableToVector3 = function(Table)
return Vector3.new(unpack(Table))
end
Vector2ToTable = function(V2)
return {V2.X,V2.Y}
end
TableToVector2 = function(Table)
return Vector2.new(unpack(Table))
end
CFrameToTable = function(CF)
return {CF:GetComponents()}
end
TableToCFrame = function(Table)
return CFrame.new(unpack(Table))
end
RoundTable = function(Table,Digits)
local RoundedTable = {}
for Index,Number in pairs(Table) do
RoundedTable[Index] = RoundNumber(Number,Digits)
end
return RoundedTable
end
FindListIndex = function(Table,Search)
for Index,Value in pairs(Table) do
if Value == Search then
return Index
end
end
end
WaitForInput = function()
local KeyPressed = Instance.new("BindableEvent")
local InputBeganConnection
InputBeganConnection =
UserInputService.InputBegan:Connect(function(Input)
if Input.UserInputType == Enum.UserInputType.Keyboard then
RunService.RenderStepped:Wait()
KeyPressed:Fire()
end
end)
KeyPressed.Event:Wait()
InputBeganConnection:Disconnect()
KeyPressed:Destroy()
end
end
-- Making GUI
local GUI -- Parenting the gui at the setup part of the script so the other guis
show up on top
do
GUI = Instance.new("ScreenGui")
GUI.Name = RandomString()
if syn then
syn.protect_gui(GUI)
end
MainFrame.Size = UDim2.fromOffset(1000,300)
MainFrame.Parent = GUI
RecordedFramesLabel.Text = "0"
RecordedFramesLabel.Size = UDim2.fromOffset(80,60)
RecordedFramesLabel.Position = UDim2.fromOffset(0,0)
RecordedFramesLabel.TextScaled = true
RecordedFramesLabel.Parent = MainFrame
ColorCodeFrame.Size = UDim2.fromOffset(140,60)
ColorCodeFrame.Position = UDim2.fromOffset(80,240)
ColorCodeFrame.TextScaled = true
ColorCodeFrame.Parent = MainFrame
WritingPressedKeysLabel.Size = UDim2.fromOffset(80,60)
WritingPressedKeysLabel.Position = UDim2.fromOffset(220,240)
WritingPressedKeysLabel.TextColor3 = Color3.new(0,0,0.5)
WritingPressedKeysLabel.TextScaled = true
WritingPressedKeysLabel.Text = "|"
WritingPressedKeysLabel.Parent = MainFrame
PressedKeysLabel.Size = UDim2.fromOffset(80,60)
PressedKeysLabel.Position = UDim2.fromOffset(220,180)
PressedKeysLabel.TextScaled = true
PressedKeysLabel.Text = "|"
PressedKeysLabel.Parent = MainFrame
ConnectedLabel.Size = UDim2.fromOffset(80,60)
ConnectedLabel.Position = UDim2.fromOffset(220,0)
ConnectedLabel.TextScaled = true
ConnectedLabel.Text = "AHK folder not found"
ConnectedLabel.TextColor3 = Color3.new(0.8,0,0)
ConnectedLabel.Parent = MainFrame
ConsoleFrame.Size = UDim2.fromOffset(700,300)
ConsoleFrame.Position = UDim2.fromOffset(300,0)
ConsoleFrame.BackgroundColor3 = Color3.fromRGB(0,0,0)
ConsoleFrame.Parent = MainFrame
CommandBar.Size = UDim2.fromOffset(700,15)
CommandBar.Position = UDim2.fromOffset(300,300)
CommandBar.BackgroundColor3 = Color3.new(0,0,0)
CommandBar.TextColor3 = Color3.new(1,1,1)
CommandBar.Text = ""
CommandBar.TextXAlignment = Enum.TextXAlignment.Left
CommandBar.BorderSizePixel = 0
CommandBar.Parent = MainFrame
ConsoleListLayout.SortOrder = Enum.SortOrder.LayoutOrder
ConsoleListLayout.FillDirection = Enum.FillDirection.Vertical
ConsoleListLayout.VerticalAlignment = Enum.VerticalAlignment.Bottom
ConsoleListLayout.Parent = ConsoleFrame
end
-- GUI Functions
local Dragify -- Dragify(Frame) -> nil
--local ConsoleMessage -- ConsoleMessage(...) -> nil
local SetColorCodeFrame -- SetColorCodeFrame(Name) -> nil
local GetColorCodeFrame -- GetColorCodeFrame() -> string
do
ConsoleMessage = function(...)
local Args = {}
local Children = ConsoleFrame:GetChildren()
do -- Remove oldest message if console messages hit the top
if #Children > 15 then
local LowestLayoutOrder = {
Label = nil;
LayoutOrder = math.huge;
}
for _,v in pairs(Children) do
if v:IsA("TextLabel") then
if v.LayoutOrder <
LowestLayoutOrder.LayoutOrder then
LowestLayoutOrder.Label = v
LowestLayoutOrder.LayoutOrder =
v.LayoutOrder
end
end
end
if LowestLayoutOrder.Label then
LowestLayoutOrder.Label:Destroy()
end
Children = ConsoleFrame:GetChildren()
end
end
do -- Convert args to string
for Index,Value in pairs({...}) do
Args[Index] = tostring(Value)
end
end
local Message = table.concat(Args," ")
local Label = ConsoleMessageLabel:Clone()
Label.Size = UDim2.fromOffset(700,20)
Label.TextSize = 14
Label.Font = Enum.Font.Code
Label.BackgroundTransparency = 1
Label.TextColor3 = Color3.fromRGB(255,255,255)
Label.TextXAlignment = Enum.TextXAlignment.Left
Label.Text = " "..Message
Label.LayoutOrder = -999999999+#Children
Label.Parent = ConsoleFrame
end
ConsoleMessage("Tasability loading...")
Dragify = function(Frame)
local dragToggle,dragStart,dragInput,dragPos,startPos
local dragSpeed = 0.50
local function updateInput(input)
local Delta = input.Position - dragStart
Frame.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset +
Delta.X, startPos.Y.Scale, startPos.Y.Offset + Delta.Y)
end
Frame.InputBegan:Connect(function(input)
if (input.UserInputType == Enum.UserInputType.MouseButton1 or
input.UserInputType == Enum.UserInputType.Touch) and
UserInputService:GetFocusedTextBox() == nil then
dragToggle = true
dragStart = input.Position
startPos = Frame.Position
input.Changed:Connect(function()
if input.UserInputState == Enum.UserInputState.End
then
dragToggle = false
end
end)
end
end)
Frame.InputChanged:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseMovement or
input.UserInputType == Enum.UserInputType.Touch then
dragInput = input
end
end)
game:GetService("UserInputService").InputChanged:Connect(function(input)
if input == dragInput and dragToggle then
updateInput(input)
end
end)
end
SetColorCodeFrame = function(Name)
ColorCodeFrame.BackgroundColor3 = ColorCodes[Name] or ColorCodes.None
ColorCodeFrame.Text = ColorCodes[Name] and Name or "None"
end
GetColorCodeFrame = function()
return ColorCodeFrame.Text
end
end
do -- Anticheat bypasses
do -- standard anti kick
--// Variables
game:GetService("StarterGui"):SetCore("SendNotification", {
Title = "Almost Kicked",
Text = tostring(({...})[1]),
Icon = "rbxassetid://6238540373",
Duration = 3,
})
end
return nil
end
end)
end
return oldspawn(...)
end)
sendremote:Destroy()
end)
end
-- Animation Functions
local StopAllAnimations -- StopAllAnimations() -> nil
local Reanimate -- Reanimate(Character) -> nil
function
configureAnimationSet(name, fileList)
if (animTable[name] ~= nil)
then
for _, connection in
pairs(animTable[name].connections) do
connection:disconnect()
end
end
animTable[name] = {}
animTable[name].count = 0
animTable[name].totalWeight =
0
animTable[name].connections =
{}
-- fallback to defaults
if (animTable[name].count <=
0) then
for idx, anim in
pairs(fileList) do
animTable[name]
[idx] = {}
animTable[name]
[idx].anim = Instance.new("Animation")
animTable[name]
[idx].anim.Name = name
animTable[name]
[idx].anim.AnimationId = anim.id
animTable[name]
[idx].weight = anim.weight
animTable[name].count = animTable[name].count + 1
-- ANIMATION
-- declarations
local toolAnim = "None"
local toolAnimTime = 0
local jumpAnimTime = 0
local jumpAnimDuration = 0.3
-- functions
function stopAllAnimations()
local oldAnim = currentAnim
-- return to idle if
finishing an emote
if (emoteNames[oldAnim] ~=
nil and emoteNames[oldAnim] == false) then
oldAnim = "idle"
end
currentAnim = ""
currentAnimInstance = nil
if
(currentAnimKeyframeHandler ~= nil) then
currentAnimKeyframeHandler:disconnect()
end
if (currentAnimTrack ~= nil)
then
currentAnimTrack:Stop()
currentAnimTrack:Destroy()
currentAnimTrack = nil
end
return oldAnim
end
setAnimationSpeed = function(speed)
if speed ~= currentAnimSpeed
then
currentAnimSpeed = speed
currentAnimTrack:AdjustSpeed(currentAnimSpeed)
end
end
function
keyFrameReachedFunc(frameName)
if (frameName == "End") then
local repeatAnim =
currentAnim
-- return to idle if
finishing an emote
if
(emoteNames[repeatAnim] ~= nil and emoteNames[repeatAnim] == false) then
repeatAnim =
"idle"
end
local animSpeed =
currentAnimSpeed
setAnimationSpeed(animSpeed)
end
end
-- Preload animations
playAnimation = function(animName,
transitionTime, humanoid, bypassAnimateDisabled)
--print(animName,
transitionTime, humanoid, bypassAnimateDisabled)
pcall(function()
if AnimateDisabled and not
bypassAnimateDisabled then
return
end
table.insert(AnimationQueue,
{animName,transitionTime})
-- switch animation
if (anim ~=
currentAnimInstance) then
if (currentAnimTrack ~=
nil) then
currentAnimTrack:Stop(transitionTime)
currentAnimTrack:Destroy()
end
currentAnimSpeed = 1.0
-- load it to the
humanoid; get AnimationTrack
currentAnimTrack =
humanoid:LoadAnimation(anim)
currentAnimTrack.Priority = Enum.AnimationPriority.Core
currentAnimTrack:Play(transitionTime)
currentAnim = animName
currentAnimInstance =
anim
currentAnimKeyframeHandler:disconnect()
end
currentAnimKeyframeHandler =
currentAnimTrack.KeyframeReached:connect(keyFrameReachedFunc)
end
end)
end
-----------------------------------
--------------------------------------------------------
-----------------------------------
--------------------------------------------------------
function
toolKeyFrameReachedFunc(frameName)
if (frameName == "End") then
-- print("Keyframe : "..
frameName)
function
playToolAnimation(animName, transitionTime, humanoid, priority)
local roll =
math.random(1, animTable[animName].totalWeight)
local origRoll = roll
local idx = 1
while (roll >
animTable[animName][idx].weight) do
roll = roll -
animTable[animName][idx].weight
idx = idx + 1
end
-- print(animName .. " *
" .. idx .. " [" .. origRoll .. "]")
local anim =
animTable[animName][idx].anim
if (toolAnimInstance ~=
anim) then
if (toolAnimTrack
~= nil) then
toolAnimTrack:Stop()
toolAnimTrack:Destroy()
transitionTime = 0
end
-- load it to the
humanoid; get AnimationTrack
toolAnimTrack =
humanoid:LoadAnimation(anim)
if priority then
toolAnimTrack.Priority = priority
end
-- play the
animation
toolAnimTrack:Play(transitionTime)
toolAnimName =
animName
toolAnimInstance =
anim
currentToolAnimKeyframeHandler =
toolAnimTrack.KeyframeReached:connect(toolKeyFrameReachedFunc)
end
end
function stopToolAnimations()
local oldAnim = toolAnimName
if
(currentToolAnimKeyframeHandler ~= nil) then
currentToolAnimKeyframeHandler:disconnect()
end
toolAnimName = ""
toolAnimInstance = nil
if (toolAnimTrack ~= nil)
then
toolAnimTrack:Stop()
toolAnimTrack:Destroy()
toolAnimTrack = nil
end
return oldAnim
end
-----------------------------------
--------------------------------------------------------
-----------------------------------
--------------------------------------------------------
onRunning = function(speed)
if speed > 0.01 then
playAnimation("walk",
0.1, Humanoid)
if currentAnimInstance
and currentAnimInstance.AnimationId == "http://www.roblox.com/asset/?id=180426354"
then
setAnimationSpeed(speed / 14.5)
end
pose = "Running"
else
if
emoteNames[currentAnim] == nil then
onDied = function()
pose = "Dead"
end
onJumping = function()
playAnimation("jump", 0.1,
Humanoid)
jumpAnimTime =
jumpAnimDuration
pose = "Jumping"
end
onClimbing = function(speed)
playAnimation("climb", 0.1,
Humanoid)
setAnimationSpeed(speed /
12.0)
pose = "Climbing"
end
onGettingUp = function()
pose = "GettingUp"
end
onFreeFall = function()
if (jumpAnimTime <= 0) then
playAnimation("fall",
fallTransitionTime, Humanoid)
end
pose = "FreeFall"
end
onFallingDown = function()
pose = "FallingDown"
end
onSeated = function()
pose = "Seated"
end
onPlatformStanding = function()
pose = "PlatformStanding"
end
onSwimming = function(speed)
if speed > 0 then
pose = "Running"
else
pose = "Standing"
end
end
function getTool()
for _, kid in
ipairs(Figure:GetChildren()) do
if kid.className ==
"Tool" then return kid end
end
return nil
end
function getToolAnim(tool)
for _, c in
ipairs(tool:GetChildren()) do
if c.Name == "toolanim"
and c.className == "StringValue" then
return c
end
end
return nil
end
function animateTool()
function moveSit()
RightShoulder.MaxVelocity =
0.15
LeftShoulder.MaxVelocity =
0.15
RightShoulder:SetDesiredAngle(3.14 /2)
LeftShoulder:SetDesiredAngle(-3.14 /2)
RightHip:SetDesiredAngle(3.14
/2)
LeftHip:SetDesiredAngle(-3.14
/2)
end
local lastTick = 0
function move(time)
if AnimateDisabled then
return
end
local amplitude = 1
local frequency = 1
local deltaTime = time -
lastTick
lastTick = time
local climbFudge = 0
local setAngles = false
if (setAngles) then
local desiredAngle =
amplitude * math.sin(time * frequency)
RightShoulder:SetDesiredAngle(desiredAngle + climbFudge)
LeftShoulder:SetDesiredAngle(desiredAngle - climbFudge)
RightHip:SetDesiredAngle(-desiredAngle)
LeftHip:SetDesiredAngle(-desiredAngle)
end
local
animStringValueObject = getToolAnim(tool)
if animStringValueObject
then
toolAnim =
animStringValueObject.Value
-- message
recieved, delete StringValue
animStringValueObject.Parent = nil
toolAnimTime =
time + .3
end
animateTool()
else
stopToolAnimations()
toolAnim = "None"
toolAnimInstance = nil
toolAnimTime = 0
end
end
-- connect events
Humanoid.Died:connect(function(...)
if AnimateDisabled then
return
end
--
table.insert(AnimationQueue,1)
onDied(...)
end)
Humanoid.Running:connect(function(Speed)
if AnimateDisabled then
return
end
--
table.insert(AnimationQueue,2)
--RunSpeed = Speed
onRunning(Speed)
end)
Humanoid.Jumping:connect(onJumping)
Humanoid.Climbing:connect(function(Speed)
if AnimateDisabled then
return
end
--
table.insert(AnimationQueue,4)
--ClimbSpeed = Speed
onClimbing(Speed)
end)
Humanoid.GettingUp:connect(function(...)
if AnimateDisabled then
return
end
--
table.insert(AnimationQueue,5)
onGettingUp(...)
end)
Humanoid.FreeFalling:connect(function(...)
if AnimateDisabled then
return
end
--
table.insert(AnimationQueue,6)
onFreeFall(...)
end)
Humanoid.FallingDown:connect(function(...)
if AnimateDisabled then
return
end
--
table.insert(AnimationQueue,7)
onFallingDown(...)
end)
Humanoid.Seated:connect(function(...)
if AnimateDisabled then
return
end
--
table.insert(AnimationQueue,8)
onSeated(...)
end)
Humanoid.PlatformStanding:connect(function(...)
if AnimateDisabled then
return
end
--
table.insert(AnimationQueue,9)
onPlatformStanding(...)
end)
Humanoid.Swimming:connect(function(...)
if AnimateDisabled then
return
end
--
table.insert(AnimationQueue,10)
onSwimming(...)
end)
game:GetService("Players").LocalPlayer.Chatted:connect(function(msg)
local emote = ""
if msg == "/e dance" then
emote =
dances[math.random(1, #dances)]
elseif (string.sub(msg, 1, 3)
== "/e ") then
emote = string.sub(msg,
4)
elseif (string.sub(msg, 1, 7)
== "/emote ") then
emote = string.sub(msg,
8)
end
end)
-- main program
-- initialize to idle
playAnimation("idle", 0.1,
Humanoid)
pose = "Standing"
spawn(function()
while Figure.Parent ~= nil do
local _, time =
wait(0.1)
move(time)
end
end)
end
end
end
-- Camera/Input Functions
local GetZoom -- GetZoom() -> number
local SetZoom -- SetZoom(Zoom) -> nil
local ZoomControllers = {}
RunService:BindToRenderStep("ShiftLockadsaf",
Enum.RenderPriority.Character.Value, function()
UserInputService.MouseBehavior =
Enum.MouseBehavior.LockCenter --Set the mouse to center every frame.
local _, y =
workspace.CurrentCamera.CFrame.Rotation:ToEulerAnglesYXZ() --Get the angles of the
camera
RootPart.CFrame = CFrame.new(RootPart.Position) *
CFrame.Angles(0,y,0) --Set the root part to the camera's rotation
end)
else
Humanoid.AutoRotate = true --Let the Humanoidanoid handle the
camera rotations again.
Humanoid.CameraOffset = Vector3.new(0,0,0) --Move the camera back
to normal.
RunService:UnbindFromRenderStep("ShiftLockadsaf") -- Allow mouse
to move freely.
UserInputService.MouseBehavior = Enum.MouseBehavior.Default --
Let the mouse move freely
end
end
SetShiftLockEnabled = function(Enabled)
if ShiftLockEnabled ~= Enabled then
ShiftLockEnabled = Enabled
if Enabled then
SetCursor("MouseLockedCursor")
else
SetCursor("ArrowFarCursor")
end
shiftLock(Enabled)
end
end
SetCameraCFrame = function(NewCFrame)
CameraCFrame = NewCFrame
workspace.CurrentCamera.CFrame = NewCFrame
end
-- AHK Functions
local IsInstalled -- IsInstalled() -> bool
local SendSignal -- SendSignal(Signal) -> nil
do
IsInstalled = function()
return isfolder(AHKConnectionFolderPath)
end
SendSignal = function(Signal)
if IsInstalled() then
writefile(AHKConnectionRequestPath,Signal)
else
ConsoleMessage("AHK folder not found")
end
end
end
-- Replay Functions
local GetReplayFile -- GetReplayFile() -> string
local ReplayEncode -- ReplayEncode(Table) -> string
local ReplayDecode -- ReplayEncode(String) -> table
ReplayEncode = function(Table)
ConsoleMessage("Encoding "..tostring(#Table).." frames")
local StartTick = tick()
local Encoded = json.encode(Table)
ConsoleMessage("Done encoding in",RoundNumber(tick()-
StartTick,2),"seconds")
return ReplayFileBeginning..Encoded..ReplayFileEnding
end
ReplayDecode = function(String)
if String == ReplayFileBeginning or String ==
ReplayFileBeginning..ReplayFileEnding then
ConsoleMessage("Nothing to read")
return
end
ConsoleMessage("Decoding "..tostring(#String).." characters")
local StartTick = tick()
local Decoded = json.decode(String)
ConsoleMessage("Done decoding in",RoundNumber(tick()-
StartTick,2),"seconds")
return Decoded.Replay
end
RecordReplay = function()
ConsoleMessage("Waiting for input")
if Writing then
ConsoleMessage("Recording stopped")
StopRecording()
return
end
SetColorCodeFrame("WaitingForInput")
WaitForInput()
StartRecording()
ConsoleMessage("Recording started")
end
StartRecording = function()
if not Reading then
SetColorCodeFrame("Recording")
Writing = true
end
end
StopRecording = function()
if not Reading then
Writing = false
end
end
SaveToFile = function()
local ReplayEncoded = ReplayEncode(ReplayTable)
writefile(ReplayPath,ReplayEncoded)
end
SaveRecording = function()
if #RecordingTable > 0 then
local old = #ReplayTable
for _,Frame in pairs(RecordingTable) do
table.insert(ReplayTable,Frame)
end
RecordingTable = {}
ConsoleMessage("Saved")
end
end
DiscardRecording = function()
if #RecordingTable > 0 then
RecordingTable = {}
ConsoleMessage("Discarded")
end
end
StartReading = function()
if not Reading then
SaveToFile()
ReplayTable = ReplayDecode(GetReplayFile()) -- Decode replay from
file
if ReplayTable then
-- Decoding successful
Freeze(false) -- Unfreeze
AnimateDisabled = true -- Disable fake animate script
Workspace.Gravity = 0
ReplayTableIndex = 1
BlockInputs() -- Disable scrolling and clicks
Reading = true
SetColorCodeFrame("Reading")
ConsoleMessage("Reading started")
ConsoleMessage("Length:
"..RoundNumber(tostring(#ReplayTable/60)).." seconds")
else
-- Decoding failed
ReplayTable = {}
SetColorCodeFrame("Idle")
end
else
ConsoleMessage("You are already reading")
end
end
StopReading = function()
if Reading then
UnblockInputs() -- Enable scrolling and clicks
Character.Head.CanCollide = true -- Fix character collisions
Character.Torso.CanCollide = true -- Fix character collisions
Character.HumanoidRootPart.CanCollide = true -- Fix character
collisions
AnimateDisabled = false -- Enable fake animate script
Reading = false
Character.Humanoid.JumpPower = DefaultJumpPower
Character.Humanoid.WalkSpeed = DefaultWalkSpeed
Workspace.Gravity = DefaultGravity
SetColorCodeFrame("Idle")
ConsoleMessage("Reading stopped")
else
ConsoleMessage("You are not reading")
end
end
end
-- Tasability functions
--local Freeze -- Freeze(NewFrozen) -> nil
do
Freeze = function(NewFrozen,DoNotRecord)
if Frozen ~= NewFrozen and not Reading then
SeekDirection = 0
if NewFrozen then
Frozen = true
StopRecording()
SaveRecording()
FreezeFrame = #ReplayTable
SetColorCodeFrame("Frozen")
else
--ConsoleMessage(#ReplayTable)
--ConsoleMessage(FreezeFrame)
if DoNotRecord then
Frozen = false
SetColorCodeFrame("Idle")
else
for Index = #ReplayTable,FreezeFrame,-1 do
--ConsoleMessage(Index)
ReplayTable[Index] = nil
end
Frozen = false
StartRecording()
SetColorCodeFrame("Recording")
end
end
end
end
end
-- Commands
local Commands = {}
do
Commands["help"] = function(Args)
if Args == "help" then
ConsoleMessage("help <command>: Shows a list of all commands, or
a specific command")
else
local Command = Args[1]
if Command then
Command = string.lower(Command)
if Commands[Command] then
Commands[Command]("help")
else
ConsoleMessage("Command", Command, "was not found")
end
else
for _,Command in pairs(Commands) do
Command("help")
end
end
end
end
Commands["erase"] = function(Args)
if Args == "help" then
ConsoleMessage("erase: Erases all data from the folder",PlaceId)
else
writefile(ReplayPath,ReplayFileBeginning)
ReplayTable = {}
return ReplayPath.." has been erased"
end
end
Commands["setsdm"] = function(Args)
if Args == "help" then
ConsoleMessage("setsdm <number SeekDirectionMultiplier>: Sets
speed multiplier when using R and T while frozen")
else
local Number = tonumber(Args[1]) or 1
if Number then
local OldValue = SeekDirectionMultiplier
SeekDirectionMultiplier = Number
return "SeekDirectionMultiplier has been set from
"..tostring(OldValue).." to "..tostring(Number)
end
end
end
Commands["rejoin"] = function(Args)
if Args == "help" then
ConsoleMessage("rejoin <bool SaveReplay>: Sets one of the configs
at the top of the script (PlaybackInputs, etc)")
else
local SaveReplay = Args[1] and string.lower(Args[1])
ConsoleMessage("Saving...")
if SaveReplay == "true" or SaveReplay == "yes" or SaveReplay ==
"1" or SaveReplay == "save" then
SaveToFile()
end
ConsoleMessage("Rejoining...")
if #game.Players:GetPlayers() <= 1 then
game.Players.LocalPlayer:Kick("\nRejoining...")
wait()
game:GetService("TeleportService"):Teleport(game.PlaceId,
game.Players.LocalPlayer)
else
game:GetService("TeleportService"):TeleportToPlaceInstance(game.PlaceId,
game.JobId, game.Players.LocalPlayer)
end
return "Sent request to rejoin"
end
end
Commands["invite"] = function(Args)
if Args == "help" then
ConsoleMessage("invite: Invites you to Tasability Discord")
else
request({
Url = "http://127.0.0.1:6463/rpc?v=1",
Method = "POST",
Headers = {
["Content-Type"] = "application/json",
["origin"] = "https://discord.com",
},
Body = game:GetService("HttpService"):JSONEncode({
["args"] = {
["code"] = "Shyfsc2cJ9",
},
["cmd"] = "INVITE_BROWSER",
["nonce"] = "."
})
})
return "Sent invite (if your exploit blocked it the invite is
https://discord.gg/Shyfsc2cJ9)"
end
end
end
-- Connection Functions
local StateChanged
local CharacterAdded
local InputBegan
local RenderStepped
local Stepped
local ReadButton_MouseButton1Click
local SaveToFileButton_MouseButton1Click
local IdleButton_MouseButton1Click
local CurrentPlaceIdButton_MouseButton1Click
local CurrentCamera_Changed
local CommandBar_FocusLost
local CommandBar_MouseEnter
local CommandBar_MouseLeave
do
StateChanged = function(_,State)
table.insert(HumanoidStateQueue,State.Value)
end
CharacterAdded = function(NewCharacter)
Humanoid = NewCharacter:WaitForChild("Humanoid")
Humanoid.StateChanged:Connect(StateChanged)
RootPart = NewCharacter:WaitForChild("HumanoidRootPart")
DefaultJumpPower = Humanoid.JumpPower
DefaultWalkSpeed = Humanoid.WalkSpeed
Reanimate(NewCharacter)
Character = NewCharacter
Humanoid.Died:Connect(function()
Dead = true
end)
Dead = false
end
InputBegan = function(Input,GameProcessed)
if IgnoreGameProcessed then
GameProcessed = false
end
-- RenderStepped/Stepped connections
do
RenderSteppedConnections.UpdateFreezeFrame = function()
RecordedFramesLabel.Text = RoundNumber(FreezeFrame,0)
end
RenderSteppedConnections.UpdateIgnoreGameProcessedButton = function()
if IgnoreGameProcessed then
IgnoreGameProcessedButton.BackgroundColor3 =
Color3.new(0.5,1,0.5)
else
IgnoreGameProcessedButton.BackgroundColor3 =
Color3.new(1,0.5,0.5)
end
end
RenderSteppedConnections.SeekDirectionHandler = function()
if Frozen then
local NewFreezeFrame = FreezeFrame + SeekDirection
if NewFreezeFrame < 1 then
FreezeFrame = 1
elseif NewFreezeFrame > #ReplayTable then
FreezeFrame = #ReplayTable
else
FreezeFrame = NewFreezeFrame
end
end
end
local PressedWriting = {}
SteppedConnections.UpdateInputPreview = function()
for _,Input in pairs(InputBeganQueue) do
if Input == "u" or Input == "d" then
return
end
Pressed[Input] = true
end
for _,Input in pairs(InputEndedQueue) do
Pressed[Input] = nil
end
PressedKeysLabel.Text = "|"
for Input,_ in pairs(Pressed) do
PressedKeysLabel.Text = PressedKeysLabel.Text..Input.."|"
end
do -- Connections
UserInputService.InputBegan:Connect(InputBegan)
UserInputService.InputChanged:Connect(InputChanged)
UserInputService.InputEnded:Connect(InputEnded)
RunService.RenderStepped:Connect(RenderStepped)
RunService.Stepped:Connect(Stepped)
Player.CharacterAdded:Connect(CharacterAdded)
ReadButton.MouseButton1Click:Connect(ReadButton_MouseButton1Click)
SaveToFileButton.MouseButton1Click:Connect(SaveToFileButton_MouseButton1Click)
IdleButton.MouseButton1Click:Connect(IdleButton_MouseButton1Click)
CurrentPlaceIdButton.MouseButton1Click:Connect(CurrentPlaceIdButton_MouseButton1Cli
ck)
IgnoreGameProcessedButton.MouseButton1Click:Connect(IgnoreGameProcessedButton_Mouse
Button1Click)
workspace.CurrentCamera.Changed:Connect(CurrentCamera_Changed)
CommandBar.FocusLost:Connect(CommandBar_FocusLost)
CommandBar.MouseEnter:Connect(CommandBar_MouseEnter)
CommandBar.MouseLeave:Connect(CommandBar_MouseLeave)
end
do -- Setup
GetReplayFile() -- Create folders and files for Replayability+ if needed
SetCursor("ArrowFarCursor") -- Add fake cursor
UserInputService.MouseIconEnabled = false -- Remove real cursor
DefaultGravity = Workspace.Gravity -- Set DefaultGravity
ShiftLockBoundKeys.Value = "" -- Remove shift lock keybinds
CharacterAdded(Player.Character) -- Set character
Dragify(MainFrame) -- Draggable gui
SetColorCodeFrame("Idle") -- Set color code
GUI.Parent = GUIParent
end
spawn(function() -- Reading
while true do
if Reading then
local Frame = ReplayTable[ReplayTableIndex]
if Frame == 0 then
-- Voided
Humanoid:ChangeState(15) -- Dead
for _,Descendant in pairs(Character:GetDescendants()) do
if Descendant:IsA("BasePart") then
Descendant:Destroy()
end
end
repeat wait() until not Dead
RunService.Heartbeat:Wait()
ReplayTableIndex = ReplayTableIndex + 1
continue
elseif Frame == 1 then
-- Dead
Humanoid:ChangeState(15) -- Dead
workspace.Gravity = DefaultGravity -- So the body parts
fall
repeat wait() until not Dead
RunService.Heartbeat:Wait()
ReplayTableIndex = ReplayTableIndex + 1
continue
end
if not Frame then
StopReading()
continue
end
AnimateDisabled = true
workspace.Gravity = 0
Character.Humanoid.JumpPower = 0
Character.Humanoid.WalkSpeed = 0
SetCameraCFrame(CurrentCameraCFrame)
SetZoom(Zoom)
Humanoid:ChangeState(HumanoidState)
pose = AnimatePose
for _,Arguments in pairs(Animations) do
local Animation = Arguments[1]
local TransitionTime = Arguments[2]
if Animation == "walk" then
if Humanoid.FloorMaterial ~= Enum.Material.Air and
CurrentState ~= 3 then
playAnimation("walk",TransitionTime,Humanoid,true)
end
else
playAnimation(Animation,TransitionTime,Humanoid,true)
end
end
pcall(setAnimationSpeed,AnimationSpeed)
if ShiftLockEnabled then
SetShiftLockEnabled(true)
else
SetShiftLockEnabled(false)
end
if PlaybackMouseLocation and not ShiftLockEnabled and Zoom > 0.52
then
mousemoveabs(MouseLocation.X,MouseLocation.Y)
else
-- Middle of the screen
mousemoveabs((Resolution.X/2)+CursorOffset.X-GuiInset.X,
(Resolution.Y/2)+CursorOffset.Y-GuiInset.Y-36)
end
if PlaybackInputs then
local Signal = {}
for _,Input in pairs(InputBeganQueue) do
local Code = InputCodes[Input]
if Code then
keypress(Code)
else
if Input == "b1" then
mouse1press()
elseif Input == "b2" then
mouse2press()
elseif Input == "u" then
table.insert(Signal,"u")
elseif Input == "d" then
table.insert(Signal,"d")
else
ConsoleMessage(tostring(Input).." was not
found in InputCodes and will not be pressed")
end
end
end
for _,Input in pairs(InputEndedQueue) do
local Code = InputCodes[Input]
if Code then
keyrelease(Code)
else
if Input == "b1" then
mouse1release()
elseif Input == "b2" then
mouse2release()
else
ConsoleMessage(tostring(Input).." was not
found in InputCodes and will not be released")
end
end
end
Signal = table.concat(Signal,",") -- {"u","u","d"} ->
"u,u,d"
SendSignal(Signal)
end
--Character.HumanoidRootPart.Velocity = HumanoidRootPartVelocity
--Character.HumanoidRootPart.RotVelocity =
HumanoidRootPartRotVelocity
--Character.HumanoidRootPart.Velocity = Vector3.new()
--Character.HumanoidRootPart.RotVelocity = Vector3.new()
Character.HumanoidRootPart.CFrame = HumanoidRootPartCFrame
ReplayTableIndex = ReplayTableIndex + 1
end
RunService.Heartbeat:Wait()
end
end)
spawn(function() -- Reading but with Stepped to remove some delay on client
while true do
if Reading then
if workspace.Gravity ~= DefaultGravity then
for _,v in pairs(Character:GetChildren()) do
if v:IsA("BasePart") then
v.CanCollide = false
end
end
end
Character.HumanoidRootPart.CFrame = HumanoidRootPartCFrame
end
else
workspace.Gravity = DefaultGravity
end
RunService.Stepped:Wait()
end
end)
spawn(function() -- Reading but with RenderStepped to remove some delay on client
while true do
if Reading then
--workspace.CurrentCamera.CFrame = CameraCFrame
--Character.HumanoidRootPart.CFrame =
HumanoidRootPartCFrame
--Character.HumanoidRootPart.CFrame =
HumanoidRootPartCFrame
end
end
RunService.RenderStepped:Wait()
end
end)
spawn(function() -- Writing
while true do
--print(currentAnimSpeed)
--print(GetShiftLockEnabled())
--table.foreach(InputEndedQueue,print)
--print(GetZoom())
if Writing then
if (not Character or not Character.Parent) or (not
Character:FindFirstChild("HumanoidRootPart")) then
if type(RecordingTable[#RecordingTable]) == "table" then
table.insert(RecordingTable,0) -- Voided
end
RunService.RenderStepped:Wait()
continue
end
if (Humanoid.Health == 0) then
if type(RecordingTable[#RecordingTable]) == "table" then
table.insert(RecordingTable,1) -- Dead
end
RunService.RenderStepped:Wait()
continue
end
local Frame = {}
Frame[1] =
RoundTable(CFrameToTable(Character.HumanoidRootPart.CFrame),RoundDigits)
Frame[2] = AnimationQueue
Frame[3] = RoundNumber(currentAnimSpeed,RoundDigits)
Frame[4] = Humanoid:GetState().Value
Frame[5] =
RoundTable(Vector3ToTable(Character.HumanoidRootPart.Velocity),RoundDigits)
Frame[6] =
RoundTable(Vector3ToTable(Character.HumanoidRootPart.RotVelocity),RoundDigits)
Frame[7] =
RoundTable(CFrameToTable(workspace.CurrentCamera.CFrame),RoundDigits)
Frame[8] = RoundNumber(GetZoom(),RoundDigits)
Frame[9] = pose
Frame[10] = (GetShiftLockEnabled() and 1) or 0
Frame[11] =
RoundTable(Vector2ToTable(UserInputService:GetMouseLocation()),RoundDigits)
Frame[12] = {InputBeganQueue,InputEndedQueue}
table.insert(RecordingTable,Frame)
end
AnimationQueue = {}
RunSpeed = 0
ClimbSpeed = 0
HumanoidStateQueue = {}
if setfpscap then
setfpscap(60)
end
RunService.RenderStepped:Wait()
end
end)
-- Clear input queues
RunService.Heartbeat:Connect(function()
InputBeganQueue = {}
InputEndedQueue = {}
end)
--[[local oldprint
oldprint = hookfunction(print,function(...)
if checkcaller() then
return oldprint(...)
end
end)]]
local AnimatePose -- -2
local Animation -- -1
local HumanoidRootPartCFrame =
TableToCFrame(Frame[1]) -- 4
local AnimationSpeed = Frame[3] -- 9
local HumanoidState = Frame[4] -- 1
local HumanoidRootPartVelocity =
TableToVector3(Frame[5]) -- 2
local HumanoidRootPartRotVelocity =
TableToVector3(Frame[6]) -- 3
local CameraCFrame = TableToCFrame(Frame[7]) -- 5
local Zoom = Frame[8] -- 6
local ShiftLockEnabled = (Frame[10] == 1 and true) or
false -- 7
local MouseLocation = TableToVector2(Frame[11]) -- 8
-- -1
if Animation then
if Animation[1] == "walk" then
if Humanoid.FloorMaterial ~=
Enum.Material.Air and CurrentState ~= 3 then
playAnimation("walk",Animation[2],Humanoid,true)
end
else
playAnimation(Animation[1],Animation[2],Humanoid,true)
end
end
pcall(setAnimationSpeed,AnimationSpeed) -- 9
pose = AnimatePose -- -2
Humanoid:ChangeState(HumanoidState) -- 1
Character.HumanoidRootPart.Velocity =
HumanoidRootPartVelocity -- 2
Character.HumanoidRootPart.RotVelocity =
HumanoidRootPartRotVelocity -- 3
Character.HumanoidRootPart.CFrame =
HumanoidRootPartCFrame -- 4
workspace.CurrentCamera.CFrame = CameraCFrame -- 5
SetZoom(Zoom) -- 6
if ShiftLockEnabled ~= GetShiftLockEnabled() then
SetShiftLockEnabled(ShiftLockEnabled) -- 7
end
if PlaybackMouseLocation then
mousemoveabs(MouseLocation.X,MouseLocation.Y)
-- 8
end
else
-- Frame is not a table
RunService.RenderStepped:Wait()
end
else
--ConsoleMessage("FreezeFrame is",FreezeFrame,"(not in
range)")
end
else
pcall(function()
Character.HumanoidRootPart.Anchored = false
end)
end
RunService.RenderStepped:Wait()
end
end)
do -- Set checkpoint
ConsoleMessage("Loading from file...")
ReplayTable = ReplayDecode(GetReplayFile()) -- Decode replay from file
if not ReplayTable then
ReplayTable = {}
ConsoleMessage("There is no replay folder for",PlaceId)
end
end
ConsoleMessage("Tasability",Version,"loaded in",RoundNumber(tick()-
ExecutionTick,2),"seconds")
ConsoleMessage("Type help to see all commands")