im working on a capture the flag game, and when a player with dies, the flag is supposed to stay there for another player to pick up, but for some reason it falls through the ground instead. here's "my" code, it's taken from the capture the flag template, i did use a few slight edits, but i dont know why its broken.
ocal FlagStandManager = {}
-- ROBLOX Services
local Players = game.Players
-- Game Services
local Configurations = require(game.ServerStorage.Configurations)
-- Local Variables
local FlagObjects = {}
local FlagCarriers = {}
local Events = game.ReplicatedStorage.Events
local CaptureFlag = Events.CaptureFlag
local ReturnFlag = Events.ReturnFlag
-- Local Functions
local MakeFlag
local function DestroyFlag(flagObject)
flagObject.Flag:Destroy()
for player, object in pairs(FlagCarriers) do
if object == flagObject then
FlagCarriers[player] = nil
end
end
end
local function OnCarrierDied(player)
local flagObject = FlagCarriers[player]
if flagObject then
local flagPole = flagObject.FlagPole
local flagBanner = flagObject.FlagBanner
flagPole.CanCollide = false
flagBanner.CanCollide = false
flagPole.Anchored = true
flagBanner.Anchored = true
flagObject.PickedUp = false
FlagCarriers[player] = nil
if Configurations.RETURN_FLAG_ON_DROP then
wait(Configurations.FLAG_RESPAWN_TIME)
if not flagObject.AtSpawn and not flagObject.PickedUp then
DestroyFlag(flagObject)
MakeFlag(flagObject)
ReturnFlag:Fire(flagObject.FlagBanner.BrickColor)
end
end
end
end
local function PickupFlag(player, flagObject)
FlagCarriers[player] = flagObject
flagObject.AtSpawn = false
flagObject.PickedUp = true
local torso
if player.Character.Humanoid.RigType == Enum.HumanoidRigType.R6 then
torso = player.Character:FindFirstChild('Torso')
else
torso = player.Character:FindFirstChild('UpperTorso')
end
local flagPole = flagObject.FlagPole
local flagBanner = flagObject.FlagBanner
flagPole.Anchored = false
flagBanner.Anchored = false
flagPole.CanCollide = false
flagBanner.CanCollide = false
local weld = Instance.new('Weld', flagPole)
weld.Name = 'PlayerFlagWeld'
weld.Part0 = flagPole
weld.Part1 = torso
weld.C0 = CFrame.new(0,0,-1)
end
local function BindFlagTouched(flagObject)
local flagPole = flagObject.FlagPole
local flagBanner = flagObject.FlagBanner
flagPole.Touched:connect(function(otherPart)
local player = Players:GetPlayerFromCharacter(otherPart.Parent)
if not player then return end
if not player.Character then return end
local humanoid = player.Character:FindFirstChild('Humanoid')
if not humanoid then return end
if humanoid.Health <= 0 then return end
if flagBanner.BrickColor ~= player.TeamColor and not flagObject.PickedUp then
PickupFlag(player, flagObject)
elseif flagBanner.BrickColor == player.TeamColor and not flagObject.AtSpawn and Configurations.FLAG_RETURN_ON_TOUCH then
DestroyFlag(flagObject)
MakeFlag(flagObject)
ReturnFlag:Fire(flagObject.FlagBanner.BrickColor)
end
end)
end
function MakeFlag(flagObject)
flagObject.Flag = flagObject.FlagCopy:Clone()
flagObject.Flag.Parent = flagObject.FlagContainer
flagObject.FlagPole = flagObject.Flag.FlagPole
flagObject.FlagBanner = flagObject.Flag.FlagBanner
flagObject.FlagBanner.CanCollide = false
flagObject.AtSpawn = true
flagObject.PickedUp = false
BindFlagTouched(flagObject)
end
local function BindBaseTouched(flagObject)
local flagBase = flagObject.FlagBase
flagBase.Touched:connect(function(otherPart)
local player = Players:GetPlayerFromCharacter(otherPart.Parent)
if not player then return end
if flagBase.BrickColor == player.TeamColor and FlagCarriers[player] then
CaptureFlag:Fire(player)
local otherFlag = FlagCarriers[player]
DestroyFlag(otherFlag)
MakeFlag(otherFlag)
if player.Team == game.Teams.Red then
game.Workspace.RedPoints.Value = game.Workspace.RedPoints.Value + 1
end
if player.Team == game.Teams.Blue then
game.Workspace.BluePoints.Value = game.Workspace.BluePoints.Value + 1
end
if game.Workspace.Mode.Value == 2 then
player.Character.Humanoid.WalkSpeed = 30
if player.Team == game.Teams.Red then
game.Workspace.RedPoints.Value = game.Workspace.RedPoints.Value + 1
end
if player.Team == game.Teams.Blue then
game.Workspace.BluePoints.Value = game.Workspace.BluePoints.Value + 1
end
end
if game.Workspace.Mode.Value == 3 then
if player.Team == game.Teams.Red then
game.Workspace.RedPoints.Value = game.Workspace.RedPoints.Value - 1
game.Workspace.BluePoints.Value = game.Workspace.BluePoints.Value - 1
end
if player.Team == game.Teams.Blue then
game.Workspace.BluePoints.Value = game.Workspace.BluePoints.Value - 1
game.Workspace.RedPoints.Value = game.Workspace.RedPoints.Value - 1
end
end
end
end)
end
local function OnPlayerAdded(player)
player.CharacterAdded:connect(function(character)
character:WaitForChild('Humanoid').Died:connect(function() OnCarrierDied(player) end)
end)
player.CharacterRemoving:connect(function()
OnCarrierDied(player)
end)
end
-- Public Functions
function FlagStandManager:Init(container)
local flagObject = {}
local success, message = pcall(function()
flagObject.AtSpawn = true
flagObject.PickedUp = false
flagObject.TeamColor = container.FlagStand.BrickColor
flagObject.Flag = container.Flag
flagObject.FlagPole = container.Flag.FlagPole
flagObject.FlagBanner = container.Flag.FlagBanner
flagObject.FlagBase = container.FlagStand
flagObject.FlagCopy = container.Flag:Clone()
flagObject.FlagContainer = container
end)
if not success then
warn("Flag object not built correctly. Please load fresh template to see how flag stand is expected to be made.")
end
BindBaseTouched(flagObject)
DestroyFlag(flagObject)
MakeFlag(flagObject)
table.insert(FlagObjects, flagObject)
end
-- Event Bindings
Players.PlayerAdded:connect(OnPlayerAdded)
return FlagStandManager
