FS - ALL EMOTES [FE] [ALL EXEC SUPPORTED]
FEATURES: [CUSTOM UI - PC & MOBILE COMPATIBLE!] [ALL FORSAKEN EMOTE ANIMATIONS] [EMOTE SEARCH] [AUTO PLAY EMOTES] [PLAY / STOP EMOTES]
the risk scan cleared this script. it still noticed a few things:
risk 1/10 · safe · obfuscated with Generic
sends data to or loads code from rscripts.net.
loadstring(game:HttpGet("https://pasteblox.com/raw/w2h49xjnqe"))()pbx pull w2h49xjnqeraw link never changes · v1 live
--[[*
*If you enjoy the script, please consider liking the post.*
*It helps motivate me to release more open-source scripts*
*and keep existing ones updated.*
*MADE BY: [https://rscripts.net/@Yamis_Scripts]*
*]]
if not game:IsLoaded() then
game.Loaded:Wait()
end
local StarterGui = game:GetService("StarterGui")
local missing = {}
if type(setclipboard) ~= "function" then
table.insert(missing, "setclipboard")
end
if #missing > 0 then
local executorName = "Unknown Executor"
if type(identifyexecutor) == "function" then
local ok, name = pcall(identifyexecutor)
if ok and type(name) == "string" and name ~= "" then
executorName = name
end
end
local title = "[" .. executorName .. "]: Not Supported"
local description = "Missing: " .. table.concat(missing, ", ")
local notified = pcall(function()
StarterGui:SetCore("SendNotification", { Title = title, Text = description, Duration = 8 })
end)
if not notified then
warn(title .. " - " .. description)
end
return
end
assert(game.PlaceId == 83645629621104, "This script targets Forsaken place 83645629621104")
local function readAttribution()
local encoded = string.reverse("f541ed9c6f187160a3e5bca5d24621775c91c7b0b82b4bd49d47b2552a4cd8009f5d595c513080b8cf86a0e615b5e3b513354f9ca63db1acd90fb28cef3469de3c584330df894114a8330c5e21c2998c349cbb4a1ee37eb2b5ab27fd76dc9d2b703b39998c1d71d2f4c77033f8c15be9f3280f39b609ecd2cdd7aac5")
local length = #encoded / 2
assert(length == 124, "Attribution data missing")
local bytes = table.create(length)
local seed = (17 * 23 + 52) % 256
local fingerprint = 17
for index = 1, length do
seed = (seed * 79 + 23) % 256
local offset = ((index - 1) * 17) % length * 2 + 1
local value = assert(tonumber(string.sub(encoded, offset, offset + 1), 16), "Invalid attribution data")
local shifted = (value - (index * 29 + 51)) % 256
local rotation = (index * 3) % 8
local original = (bit32.rshift(shifted, rotation) + bit32.lshift(shifted, 8 - rotation)) % 256
local decoded = bit32.bxor(original, seed)
bytes[index] = string.char(decoded)
fingerprint = (fingerprint * 131 + decoded) % 2147483647
end
assert(fingerprint == 1958912220, "Attribution data changed")
local fields = string.split(table.concat(bytes), string.char(31))
assert(#fields == 7, "Attribution fields missing")
return {
credit = fields[1],
url = fields[2],
assets = fields[3],
catalog = fields[4],
screen = fields[5],
overlay = fields[6],
shutdown = fields[7],
}
end
local attribution = readAttribution()
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local TextService = game:GetService("TextService")
local UserInputService = game:GetService("UserInputService")
local localPlayer = Players.LocalPlayer
local playerGui = localPlayer:WaitForChild("PlayerGui", 8)
local assets = ReplicatedStorage:WaitForChild(attribution.assets, 8)
local emoteModules = assets and assets:WaitForChild(attribution.catalog, 8)
assert(playerGui and emoteModules, "Missing PlayerGui or Assets.Emotes")
local PALETTE = {
background = Color3.fromRGB(21, 19, 21),
list = Color3.fromRGB(15, 13, 15),
raised = Color3.fromRGB(37, 31, 34),
hover = Color3.fromRGB(53, 43, 47),
border = Color3.fromRGB(78, 63, 67),
muted = Color3.fromRGB(166, 153, 156),
text = Color3.fromRGB(238, 232, 230),
accent = Color3.fromRGB(197, 93, 94),
accentDim = Color3.fromRGB(86, 38, 43),
}
type Emote = {
name: string,
moduleName: string,
animationId: any,
sfx: any,
sfxProperties: any,
serverEffects: boolean,
}
type WindowControls = {
screen: ScreenGui?,
copyLayer: ScreenGui?,
safe: Frame?,
window: Frame?,
search: TextBox?,
clear: TextButton?,
list: ScrollingFrame?,
listHolder: Frame?,
empty: TextLabel?,
count: TextLabel?,
status: TextLabel?,
auto: TextButton?,
play: TextButton?,
opener: TextButton?,
}
type PlaybackState = {
alive: boolean,
open: boolean,
autoPlay: boolean,
selected: Emote?,
playing: Emote?,
playToken: any,
track: AnimationTrack?,
animation: Animation?,
sound: Sound?,
playConnections: { RBXScriptConnection },
connections: { RBXScriptConnection },
rows: { [any]: (boolean) -> () },
rowInstances: { [any]: TextButton },
catalog: { Emote },
ui: WindowControls,
}
local state: PlaybackState = {
alive = true,
open = true,
autoPlay = false,
selected = nil,
playing = nil,
playToken = nil,
track = nil,
animation = nil,
sound = nil,
playConnections = {},
connections = {},
rows = {},
rowInstances = {},
catalog = {},
ui = {},
}
local session = { unload = nil :: (() -> ())? }
local function connect(signal: RBXScriptSignal, callback: (...any) -> ())
local connection = signal:Connect(callback)
table.insert(state.connections, connection)
return connection
end
local function make(className: string, properties: { [string]: any }, parent: Instance?): any
local instance = Instance.new(className)
for property, value in pairs(properties) do
(instance :: any)[property] = value
end
instance.Parent = parent
return instance
end
local function rounded(target, radius)
make("UICorner", { CornerRadius = UDim.new(0, radius) }, target)
end
local function label(parent, properties)
local defaults = {
BackgroundTransparency = 1,
TextColor3 = PALETTE.text,
Font = Enum.Font.GothamMedium,
TextSize = 14,
TextXAlignment = Enum.TextXAlignment.Left,
TextTruncate = Enum.TextTruncate.AtEnd,
}
for property, value in pairs(properties) do
defaults[property] = value
end
return make("TextLabel", defaults, parent)
end
local function button(parent, properties)
local defaults = {
AutoButtonColor = false,
BackgroundColor3 = PALETTE.raised,
BorderSizePixel = 0,
Font = Enum.Font.GothamBold,
TextColor3 = PALETTE.text,
TextSize = 12,
Selectable = true,
}
for property, value in pairs(properties) do
defaults[property] = value
end
local control = make("TextButton", defaults, parent)
rounded(control, 6)
return control
end
local function stopPlayback()
local track = state.track
state.playToken = nil
state.track = nil
state.playing = nil
for _, connection in ipairs(state.playConnections) do
connection:Disconnect()
end
table.clear(state.playConnections)
if track then
track:Stop(0.12)
track:Destroy()
end
if state.sound then
state.sound:Destroy()
state.sound = nil
end
if state.animation then
state.animation:Destroy()
state.animation = nil
end
end
function session.unload()
if not state.alive then
return
end
state.alive = false
stopPlayback()
for _, connection in ipairs(state.connections) do
connection:Disconnect()
end
table.clear(state.connections)
if state.ui.screen then
state.ui.screen:Destroy()
end
if state.ui.copyLayer then
state.ui.copyLayer:Destroy()
end
end
local function readEmote(module: Instance): (Emote?, string?)
if not module:IsA("ModuleScript") then
return nil, "Expected ModuleScript"
end
local ok, config = pcall(require, module)
if not ok then
return nil, tostring(config)
end
if type(config) ~= "table" or type(config.DisplayName) ~= "string"
or (type(config.AssetID) ~= "string" and type(config.AssetID) ~= "table") then
return nil, "missing DisplayName or AssetID"
end
return {
name = config.DisplayName,
moduleName = module.Name,
animationId = config.AssetID,
sfx = config.SFX,
sfxProperties = config.SFXProperties,
serverEffects = type(config.CreatedServer) == "function"
or type(config.DestroyedServer) == "function",
}, nil
end
local function chooseAnimation(assetId: any): (string?, string?, number?, string?)
if type(assetId) == "string" then
return assetId, nil, nil, nil
end
if type(assetId) ~= "table" then
return nil, nil, nil, nil
end
local choice = assetId
local index = nil
local variant = nil
if #assetId > 0 then
index = math.random(1, #assetId)
choice = assetId[index]
elseif type(assetId.Start) ~= "string" then
local keys = {}
for key, value in pairs(assetId) do
if type(key) == "string" and type(value) == "string" then
table.insert(keys, key)lines 1–300 of 1,273open raw find-in-page only searches the lines loaded so far. "show all" loads the rest.