Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Why is this Event manager script not working?

Asked by 8 years ago

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

Answer this question