Hold on, let me send the whole structure here:
this is my Tool’s Explorer View:

this is where the Events are being fired: (The CorePhoneHandler LocalScript)

I have here the ServerScript (which filters the Message that is being sent back to the LocalScript)

Basically, the only thing here is the Tool in StarterPack and the LocalScript in StarterGui
Edit:
If you want to see what the Script does, here’s the snippet on the Tool Activation:
CorePhoneHandler:
local BackPack = PLAYER_SERVICE.LocalPlayer.Backpack
local Tool = BackPack:WaitForChild("Hologram")
EMOTE_BUTTON.MouseButton1Click:Connect(function()
if BUTTON_BOOL == true then
TWEEN_SERVICE:Create(PHONE_GUI, TWEEN[3], {Position = UDim2.fromScale(0.113, 0.499)}):Play()
BUTTON_BOOL = false
Tool:WaitForChild("EquipUnequipEvent"):FireServer(true)
elseif BUTTON_BOOL == false then
TWEEN_SERVICE:Create(PHONE_GUI, TWEEN[3], {Position = UDim2.fromScale(-0.5, 0.499)}):Play()
BUTTON_BOOL = true
Tool:WaitForChild("EquipUnequipEvent"):FireServer(false)
end
end)
Equip Script inside the Tool:
repeat wait() until script.Parent.Parent:IsA("Backpack")
local replicatedServ = game:GetService("ReplicatedStorage")
local Phone_Holder = replicatedServ:WaitForChild("PhoneHolderFolder")
local plr = game.Players:FindFirstChild(script.Parent.Parent.Parent.Name)
local equippedStatus = {}
script.Parent:WaitForChild("EquipUnequipEvent").OnServerEvent:Connect(function(Player, state)
local tool = script.Parent.Parent:WaitForChild("Hologram")
if equippedStatus[Player] == nil or not equippedStatus[Player] then
tool.Parent = Player.Character
task.wait()
equippedStatus[Player] = true
script.Parent:WaitForChild("TweenEvent"):FireClient(Player, state)
else
script.Parent:WaitForChild("TweenEvent"):FireClient(Player, state)
task.wait(1)
tool.Parent = Player.Backpack
equippedStatus[Player] = false
end
end)
and here’s the TweenAnim LocalScript:
local Tween = game:GetService("TweenService")
local tool = script.Parent.Parent:WaitForChild("Hologram")
local TINFO = TweenInfo.new(1, Enum.EasingStyle.Cubic, Enum.EasingDirection.InOut)
local Part = script.Parent:WaitForChild("MainScreen")
local equippedStatus = {}
-- supporting frames
local s_f1 = script.Parent:WaitForChild("Border")
local s_f2 = script.Parent:WaitForChild("Border1")
local function onEquip()
Tween:Create(s_f1, TINFO, {Transparency = 0.2}):Play()
Tween:Create(s_f2, TINFO, {Transparency = 0.2}):Play()
Tween:Create(s_f1, TINFO, {Size = Vector3.new(1.7, 0.237, 0.152)}):Play()
Tween:Create(s_f2, TINFO, {Size = Vector3.new(1.7, 0.237, 0.152)}):Play()
task.wait(1)
Tween:Create(Part, TINFO, {Transparency = 0.8}):Play()
Tween:Create(Part, TINFO, {Size = Vector3.new(2.15, 2.56, 0.102)}):Play()
end
local function onUnequip()
Tween:Create(Part, TINFO, {Transparency = 1}):Play()
Tween:Create(Part, TINFO, {Size = Vector3.new(2.15, 0.01, 0.102)}):Play()
task.wait(1)
Tween:Create(s_f1, TINFO, {Transparency = 1}):Play()
Tween:Create(s_f2, TINFO, {Transparency = 1}):Play()
Tween:Create(s_f1, TINFO, {Size = Vector3.new(0.05, 0.237, 0.152)}):Play()
Tween:Create(s_f2, TINFO, {Size = Vector3.new(0.05, 0.237, 0.152)}):Play()
end
script.Parent:WaitForChild("TweenEvent").OnClientEvent:Connect(function(Player, state)
if state == true then
onEquip()
elseif state == false then
onUnequip()
end
end)
I never have anticipated how complicated this will become until now 