CFrame / Welding issue

  1. What do you want to achieve?
    For the RangeBox to act normal, and move with the model.

  2. What is the issue?
    The RangeBox does not move. It remains in place. It is not anchored and is welded to the part that moves, because other parts work too.

  3. What solutions have you tried so far?
    I have tried using Vector3 but that doesn’t work on welds - also, it broke the script even more

local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local PhysicsService = game:GetService("PhysicsService")

local getMap = ReplicatedStorage.SelectedMap
if not getMap.Value then
	getMap:GetPropertyChangedSignal("Value"):Wait()
end

local getReplicatedMap = ReplicatedStorage.Maps:FindFirstChild(tostring(getMap.Value))
if not getReplicatedMap then
	error("REPLICATED MAP: "..getMap.Name.." DOES NOT EXIST")
end

local PlacementEvents = ReplicatedStorage:WaitForChild("PlacementEvents")
local PlacementEventsMain = PlacementEvents:WaitForChild("Main")
local spawnTowerEvent = PlacementEventsMain:WaitForChild("SpawnTower")


local Camera = workspace.Camera
local gui = script.Parent
local TowerToSpawn = nil
local CanPlace = false
local Rotation = 0
local Placing = false

local function MouseRaycast(blacklist)
	local mousePosition = UserInputService:GetMouseLocation()
	
	local mouseRay = Camera:ViewportPointToRay(mousePosition.X, mousePosition.Y)
	
	local raycastParams = RaycastParams.new()
	raycastParams.FilterType = Enum.RaycastFilterType.Blacklist
	raycastParams.FilterDescendantsInstances = blacklist
	
	local raycastResult = workspace:Raycast(mouseRay.Origin, mouseRay.Direction * 1000, raycastParams)
	
	return raycastResult
end

UserInputService.InputBegan:Connect(function(input, gameProcessed)
	if gameProcessed then
		return
	end
	if TowerToSpawn then 
		if input.UserInputType == Enum.UserInputType.MouseButton1 then
			if CanPlace then
				spawnTowerEvent:FireServer(TowerToSpawn.Name, TowerToSpawn.PrimaryPart.CFrame)
				RemovePlaceholderTower()
			end
		elseif input.KeyCode == Enum.KeyCode.R then
			Rotation += 90
		end
	end
end)

function RemovePlaceholderTower()
	if TowerToSpawn then
		TowerToSpawn:Destroy()
		TowerToSpawn = nil
		Rotation = 0
		Placing = false
		for i, tower in ipairs(workspace.Towers.ActiveTowers:GetChildren()) do
			tower.RangeBox.Transparency = 1
		end
	end
end


local function AddPlaceHolderTower(name : string)
	local towerExists = getReplicatedMap.Towers:FindFirstChild(tostring(name))
	if towerExists and Placing == false then
		TowerToSpawn = towerExists:Clone()
		TowerToSpawn.Parent = workspace.Towers.PlacingTowers
		
		for i, object in ipairs(TowerToSpawn:GetDescendants()) do
			if object:IsA("BasePart") then
				PhysicsService:SetPartCollisionGroup(object, "Tower")
			end
		end
		
		for i, tower in ipairs(workspace.Towers.ActiveTowers:GetChildren()) do
			tower.RangeBox.Transparency = 0
		end
		Placing = true
	end
end

local function ColorPlaceholderTower(color)
	for i, object in ipairs(TowerToSpawn:GetDescendants()) do
		if object:IsA("BasePart") and object.Name ~= "RangeBox" then
			object.Color = color
		end
	end
	if not CanPlace then
		TowerToSpawn.Range.Transparency = 1
	else
		TowerToSpawn.Range.Transparency = 0
	end
end

gui["1"].MainButton.Activated:Connect(function()
	AddPlaceHolderTower("Tower")
end)

gui["2"].MainButton.Activated:Connect(function()
	AddPlaceHolderTower("Dummy")
end)

RunService.RenderStepped:Connect(function()
	if TowerToSpawn then
		local result = MouseRaycast({TowerToSpawn})
		if result and result.Instance then
			local GetRangeBoxTouchingParts = TowerToSpawn.RangeBox:GetTouchingParts()

			if result.Instance.Parent.Name == "TowerArea" then
				CanPlace = true
				ColorPlaceholderTower(Color3.new(0,1,0))
			else
				CanPlace = false
				ColorPlaceholderTower(Color3.new(1,0,0))
			end
			
						for index, part in ipairs(GetRangeBoxTouchingParts) do
				if part.Name == "RangeBox" and part.Parent ~= TowerToSpawn then
					CanPlace = false
					ColorPlaceholderTower(Color3.new(1,0,0))
				end
			end
			
			local x = result.Position.X
			local y
			if TowerToSpawn.Humanoid.RigType == Enum.RigType.R15 then
				y = result.Position.Y + TowerToSpawn.Humanoid.HipHeight + (TowerToSpawn.PrimaryPart.Size.Y / 2)
			else
				y = TowerToSpawn:GetExtentsSize().Y / 2
			end
			local z = result.Position.Z


			local cframe = CFrame.new(x,y,z) * CFrame.Angles(0, math.rad(Rotation), 0)
			TowerToSpawn:SetPrimaryPartCFrame(cframe)
			PhysicsService:SetPartCollisionGroup(TowerToSpawn.Range,"Tower")
			PhysicsService:SetPartCollisionGroup(TowerToSpawn.RangeBox,"TowerBox")
			TowerToSpawn.Range.Size = Vector3.new(0.1, TowerToSpawn.Levels[TowerToSpawn.CurrentLevel.Value].Range.Value * 2, TowerToSpawn.Levels[TowerToSpawn.CurrentLevel.Value].Range.Value * 2)
		end
	end
end)

image

Can someone please help? I’ve been trying to fix this for a week and I cannot find a clue to it. Please, anyone.

This is really weird. It is welded the same way as everything else and it works fine.
Have I ran into a bug?
robloxapp-20220225-2332009.wmv (1.8 MB)

Could you provide with a place file? It’s difficult to find the problem with the information provided and the code seems irrelevant.

1 Like

Will do. Is it possible that I just provide the script and model, there isn’t any issue with giving a place file, though.