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]

publicluau Forsakenupdated

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
fs-all-emotes-fe-all-exec-supported.luau
--[[*
*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.

changelog

1 version
  1. first version

    live

    @yamis_scripts·