How do I make a welded model appear on player's arm in first person?

  1. I have a model from replicated storage and when the player gets the model, it is supposed to appear on the player’s left arm.

  2. When the player gets the model, I use a weld constraint to make the model appear on the left arm. But it doesn’t appear on the arm. But when I view from the server side, I can see the model. But locally, the model doesn’t appear on the player’s arm.

  3. I have tried using a motor6D instead of the weld constraint, but it didn’t do anything. I also tried using the roblox assistant but they weren’t helpful, as usual. I’m not sure what to do, but I will leave the first person local script and the script connecting the model to the player.

First Person Script, A local script under StarterCharacterScripts

local player = game.Players.LocalPlayer
local char = player.Character
local RunService = game:GetService("RunService")

--char.Humanoid.CameraOffset = Vector3.new(0, 0, -1)

for i, v in pairs(char:GetChildren()) do
	if v:IsA("BasePart") and v.Name ~= "Head" then

		v:GetPropertyChangedSignal("LocalTransparencyModifier"):Connect(function()
			v.LocalTransparencyModifier = v.Transparency
		end)

		v.LocalTransparencyModifier = v.Transparency

	end
end

RunService.RenderStepped:Connect(function(step)
	local ray = Ray.new(char.Head.Position, ((char.Head.CFrame + char.Head.CFrame.LookVector * 2) - char.Head.Position).Position.Unit)
	local ignoreList = char:GetChildren()

	local hit, pos = game.Workspace:FindPartOnRayWithIgnoreList(ray, ignoreList)

	if hit then
		--char.Humanoid.CameraOffset = Vector3.new(0, 0, -(char.Head.Position - pos).magnitude)
	else
		char.Humanoid.CameraOffset = Vector3.new(0, 0, -1)
	end
end)

The Script that connects the Model to the Player’s Left Arm. It is under ServerScriptService

local players = game:GetService("Players")
local gotAshley = game.ReplicatedStorage.PlayerData.GotAshley
local gotAshleyEvent = game.ReplicatedStorage.PlayerTalk.GotAshleyEvent

gotAshleyEvent.OnServerEvent:Connect(function(player)
	gotAshley.Value = true
	local Char = player.Character
	local LeftArm = Char:WaitForChild("Left Arm")
	local ArmDisplay = game.ReplicatedStorage.ASHLEY:Clone()
	ArmDisplay.Parent = LeftArm

	local Studs = CFrame.new(0.1,-0.45,0) 

	local Angle = CFrame.Angles(math.rad(90),math.rad(90),math.rad(180)) 

	ArmDisplay:SetPrimaryPartCFrame(LeftArm.CFrame * Studs * Angle)

	local Weld = Instance.new("WeldConstraint", LeftArm)
	Weld.Part0 = LeftArm
	Weld.Part1 = ArmDisplay.PrimaryPart	
end)

Just add a model in the workspace and add a script in each part that should look like this:

local base = --The part that all of the parts in the model should be attached to
local PosMod = Vector3.new(position modifier)
while task.wait() do
	script.Parent.Position = base.Position + PosMod
end

That script will act like a modifiable weld.

Then you need a script that will duplicate the model when a player is added and will make the Position of the base part be the position of the desired part, and the Part1 of a WeldConstraint in the base part be the desired part. Then it should appear in first person.

This was typed on IPad, so expect typing errors on the script.

But, how is this different from what I did? From what I see, it’s just updating the position of the model to the base position. I’m just a bit confused

At least it’s more simple.

Did you know that this has a minimum character limit? That’s the entire point of this small paragraph.