This script is supposed to manage events and execute functions
However, the script doesn't work, and I don't know why. Output didn't give me anything.
Can someone please help me?
There's two scripts involved.
Here's the one that reacts to events when they are fired:
local Players = game.Players
local Events = game.ReplicatedStorage.Events
local CaptureFlag = Events.CaptureFlag
local ReturnFlag = Events.ReturnFlag
local GUI2Change = game.StarterGui.Notifier.Frame:WaitForChild("Text")
function OnCaptureFlag(player)
game.ServerScriptService.Score.Value = game.ServerScriptService.Score.Value + 1
local player = game.Players:getPlayers()
GUI2Change.Text = "The flag has been captured!"
for i = 1, #player do
player[i].PlayerGui.Notifier.Frame.Text.Text = "The flag has been captured!"
end
end
local function OnReturnFlag(flagColor)
local player = game.Players:getPlayers()
GUI2Change.Text = "The flag has been returned!"
for i = 1, #player do
player[i].PlayerGui.Notifier.Frame.Text.Text = "The flag has been returned!"
end
end
CaptureFlag.Event:connect(OnCaptureFlag)
ReturnFlag.Event:connect(OnReturnFlag)
and here's the one that actually fires them:
local 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 = player.Character:FindFirstChild('Torso')
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)
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
