Viewmodel Collision Issue In FE Weapons Kit! Please help

  1. What do you want to achieve? Keep it simple and clear!

I want to fix the character/characters weapon or view model colliding with the ground on equip. This only seems to happen when equipping the weapons, not when just walking around

  1. What is the issue? Include screenshots / videos if possible!

If you look at the ground while in first person and spam equip any of the weapons, you will most likely collide with the ground and get stunned kinda
Weapon Animation Place 2025 - Roblox

  1. What solutions have you tried so far? Did you look for solutions on the Developer Hub?

I have done the following:

  • Made sure can collide is off on everything
  • Made sure can touch is off on everything
  • Made sure can query is off on everything
  • Made sure the collision group is set to “Viewmodel” and the view model collision group is not set to collide with anything

Also, important detail, I use weld constraints, and I made sure everything was good with the welds because I heard this might be a weld issue. Also, FE weapon kit welds on the client then removes the client weld one the server creates its own weld.

I am not using the view model version of FE gun kit. I am using the normal one that comes with an automatic view model scripts which adds view model arms then changes the weld on the weapon so it alligns with the view model arms

2 Likes

It sounds like the issue might be related to how the viewmodel is interacting with the environment when equipping the weapon. Even though you’ve turned off “CanCollide” and set the collision group to “Viewmodel,” it could be a timing issue with how the welds are updated. Since the client is handling the welds first and then the server updates them, this could cause the weapon to briefly collide with the ground. You might want to check if the character’s collision settings are affecting the viewmodel, or consider temporarily disabling collisions on the character while equipping the weapon. Another thing to try is syncing the viewmodel arm animations and weapon position better, ensuring they’re in sync when equipping the weapon. Adding some debug logs could also help you pinpoint exactly when and where the collision is happening to narrow it down further.

1 Like

i do have this for a long time since dvn warfare as i used fe gun kit with this exact universal viewmodel, the problem is from how viewmodel detects Motor6D or Weld before it was able to catch up, neither of this came from the model or part since collision group was already adjusted at the beginning of tool equipping, I’ve had this exact issue reported before but my only workaround isn’t a fix as it was just to limit the hotbar cooldown (the ui you see tools listed below)

it’s pretty noticeable the higher the ping you get from what I’ve tested, viewmodel for this one uses 2 constraints (Motor6D and Weld) in most game when you equipped tools that move freely, you’re creating constraints on server, and because there’s only one constraint, when you put any tools like sword or anything that defaults to “RightGrip” it doesn’t interfere with things on client, but because we had 2 constraints each for model boundary, it will take one frame for it to disable the one on server which is what it’s supposed yo do

i had a solution of mine planned earlier which is by pre making the Motor6D on a server and store it in a table, then have it disabled on client if it was for a server so when you unequipped the tool, change either Part0 or Part1 that is either the “base part” of your gun to nil and when you equip it there, set that to something else

note that i havent rlly tried this yet but as far as i can get, this is the closest i can get to fix it

btw this belongs to #help-and-feedback:scripting-support plz use that :pray:

1 Like

Thank you so much for this information. I am a little confused on what you do in your workaround exactly…

Should I make one motor6d on the server for each weapon or only one motor6d?

Thanks! I’m really happy someone has tried to troubleshoot this before, it seemed to me to be a really niche issue.

it should be for each weapons since not all of weapons had the same constraint rigging

Ok, thanks! I’ll give it a try and share the code if it works out!

It worked! Thanks!
Here is how I did it:
First, I opened the GunServer script inside the weapon
image

Then, right before the equipped function, I added this code:

function checkVals()
	local newPlayer = script.Parent.Parent.Parent
	if newPlayer:IsA("Player") then
		Player = newPlayer
		Character = Player.Character
		Humanoid = Character:FindFirstChildOfClass("Humanoid")
		LeftArm = Character:FindFirstChild("Left Arm") or Character:FindFirstChild("LeftHand")
		RightArm = Character:FindFirstChild("Right Arm") or Character:FindFirstChild("RightHand")
		OriginalWalkSpeed = (Humanoid and Humanoid.WalkSpeed) or 16
		if not welded then
			SetCustomGrip(true)
		end
	end
end
checkVals()
Tool.AncestryChanged:Connect(checkVals)

What this does is create the weld BEFORE the weapon is equipped.
The next step is to add a new variable at the top of the script called “welded”

local welded = false

Then, in the equip function, add this check
image

Next, Comment out or remove this line on the unEquipped function

image

Lastly, replace the “SetCustomGrip()” function with this:

function SetCustomGrip(Enabled)
	if Enabled then
		GripId += 1
		local LastGripId = GripId
		for i, v in pairs(Module.CustomGrips) do
			if LastGripId ~= GripId then
				break
			end
			local Part0 = GetInstanceFromAncestor(v.CustomGripPart0)
			local Part1 = GetInstanceFromAncestor(v.CustomGripPart1)
			if not Part0 or not Part1 then
				continue
			end
			
			local Motor6DInstance = Motor6DInstances[Part1]
			if not Motor6DInstance then
				print("Created Motor6D For "..Tool.Name)
				Motor6DInstance = Instance.new("Motor6D")
				Motor6DInstance:SetAttribute("ServerInitialized", "")
				Motor6DInstance.Name = Tool.Name.."_6D"
				Motor6DInstance.Part0 = Part0
				Motor6DInstance.Part1 = Part1
			end
			if Part1.Name == "Handle" and Part1.Parent == Tool then
				if not DefaultC0 or not DefaultC1 then
					repeat task.wait() if LastGripId ~= GripId then break end until RightArm:FindFirstChild("RightGrip")
					if LastGripId == GripId then
						local RightGrip = RightArm:FindFirstChild("RightGrip")
						if RightGrip then
							DefaultC0 = RightGrip.C0
							DefaultC1 = RightGrip.C1
							RightGrip.Enabled = false
							RightGrip:Destroy()
						end
					end
				end
				if DefaultC0 and DefaultC1 then
					if v.AlignC0AndC1FromDefaultGrip then
						Motor6DInstance.C0 = DefaultC0
						Motor6DInstance.C1 = DefaultC1
					end
					if v.CustomGripCFrame then
						Motor6DInstance.C0 *= v.CustomGripC0
						Motor6DInstance.C1 *= v.CustomGripC1
					end
					Motor6DInstance.Parent = Part0
					Motor6DInstances[Part1] = Motor6DInstance
					--table.insert(Motor6DInstances, Motor6DInstance)
				end
			else
				if v.AlignC0AndC1FromDefaultGrip and DefaultC0 and DefaultC1 then
					Motor6DInstance.C0 = DefaultC0
					Motor6DInstance.C1 = DefaultC1
				end
				if v.CustomGripCFrame then
					Motor6DInstance.C0 *= v.CustomGripC0
					Motor6DInstance.C1 *= v.CustomGripC1
				end
				Motor6DInstance.Parent = Part0
				Motor6DInstances[Part1] = Motor6DInstance
				--table.insert(Motor6DInstances, Motor6DInstance)
			end
			welded = true
		end
	else
		GripId += 1
		--[[for _, v in pairs(Motor6DInstances) do
			if v then
				v:Destroy()
			end
		end
		table.clear(Motor6DInstances)
		DefaultC0 = nil
		DefaultC1 = nil]]
	end
end

I modified it to only make a motor6d if there already wasnt one before

That’s all!

Thanks, Mylo!

3 Likes