How to connect and share modules between scripts

As the title saids, how would i do that?, Basically, i am doing a SBS (Super bomb survival) game, And i Have a module that assigns functions to certain parts , by using their tag and then searching a module with that same name from the tag, And now, i don’t know how to correctly apply a function to destroy all bombs when the round ends, there are my scripts

mAINrOUND sCRIPT :

task.wait(.1)
local Seed = Random.new()

local PS = game:GetService("Players")
local SV = game:GetService("ServerStorage")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SetAtt = ReplicatedStorage:WaitForChild("SetAttribute")
local visualsr = ReplicatedStorage:WaitForChild("VisualsRemote")
local soundsw = workspace:WaitForChild("Sounds")
local soundsingame = soundsw:WaitForChild("In-Game")
local gamemodules = ReplicatedStorage:WaitForChild("GameModules")
local bombSpawner = gamemodules:WaitForChild("BombSpawner")
local bombfunctions = bombSpawner:WaitForChild("AssignBombFunction")
local BombTypesFolder = bombfunctions:WaitForChild("BombTypes")

local gamevalues = ReplicatedStorage:WaitForChild("GameValues")
local roundtimeleft = gamevalues:WaitForChild("RoundTimeLeft")
local gamestarted = gamevalues:WaitForChild("GameStarted")
local currentIntensity = gamevalues:WaitForChild("CurrentIntensity")
local intermissionTime = gamevalues:WaitForChild("IntermissionTime")
local roundtimeStart = gamevalues:WaitForChild("roundTime")
local gamestatus = gamevalues:WaitForChild("GameStatus")
local modelsmanyfolder = SV:WaitForChild("ModelsMany")
local roundEndSting = soundsw:WaitForChild("roundEndSting")
local othersFolder = workspace:WaitForChild("Others")
local bombModels = SV:WaitForChild("BombModels")
local bombsfolderworks = workspace:WaitForChild("bombs")


local loadingmapborder = modelsmanyfolder:WaitForChild("LoadingMapBorders")

local mapFolder = ReplicatedStorage:WaitForChild("Maps")
local InGameMapsFolder = workspace:WaitForChild("MapsInGame")

local requirebombFunctions = require(bombfunctions)

local AddAttributes = {
	{name = "OnMenu", value = true},
	{name = "Survived", value = false},
	{name = "elpepe", value = false},


}

PS.PlayerAdded:Connect(function(player)
	for _, attribute in ipairs(AddAttributes) do
		player:SetAttribute(attribute.name, attribute.value)
	end
	player.CharacterAdded:Connect(function(character)
		local HealthValue = Instance.new("NumberValue")
		local MaxHealthValue = Instance.new("NumberValue")

		MaxHealthValue.Parent = character
		MaxHealthValue.Name = "MaxHealth"
		MaxHealthValue.Value = 100

		HealthValue.Parent = character
		HealthValue.Name = "HealthV"
		HealthValue.Value = 100
		HealthValue:GetPropertyChangedSignal("Value"):Connect(function()
			if HealthValue then
				if HealthValue.Value <= 0 then
					HealthValue.Value = 0
					character:BreakJoints()
				end
			end
		end)
	end)
end)


task.wait(5)

--local intermission = intermissionTime
--local round = 45
local players = {}
local activePlayers = {}
local connections = {}
local roundDebounce = false


local currentMap = nil
local currentbombSpawnerPart = nil
local PlayersToCheck = 1
local DefaultLobbyTime = 35 -- 135
local DefaultGameTime = 200-- 200
local Getplayers = #PS:GetPlayers()
local roundtimeCoroutine = nil
local spawnBombsLoop = nil

local newbombspawner = othersFolder:WaitForChild("BombSpawner")

local Region = newbombspawner

function FormatSeconds(Secondss)
	local Seconds = Secondss
	local minutes = math.floor(Seconds / 60)
	local secondsRemaining = Seconds % 60
	return string.format("%d:%02d", minutes, secondsRemaining)
end

local function removePlayer(player)
	local playerFound = table.find(activePlayers, player)
	if (playerFound) then
		table.remove(activePlayers, playerFound)
		connections[player.UserId.."Left"]:Disconnect()
		connections[player.UserId.."Died"]:Disconnect()
		if (#activePlayers == 0) then
			if gamestarted.Value then
				gamestarted.Value = false
			end
		end
	end
end

function checkPlayersAmount(amount)
	Getplayers = #PS:GetPlayers()
	task.wait(.1)

	for _, player in pairs(PS:GetPlayers()) do
		if player then
			if Getplayers >= 1 then
				if player:GetAttribute("OnMenu") == true then
					return false
				end
			end
		end
	end

	if Getplayers >= amount then
		if not gamestarted.Value then
			--print("Mas o Igual de Jugadores")
			return true
		end
	elseif Getplayers < amount then
		--if not InLobby.Value then
		--print("Menos de Jugadores, La Partida no comenzara")
		return false
		--end

	end

	if Getplayers <= 0 then	
		warn("No Hay Nadie en El Servidor, Checkeando Infinitamente.")
	end

end

function SearchIn(folder : Folder , name : string, selectRandom : boolean)
	if folder and folder:IsA("Folder") then
		if  selectRandom then
			local getChildren = folder:GetChildren()
			local choosenitem = getChildren[Seed:NextInteger(1, #getChildren)]
			if choosenitem then
				return choosenitem
			else
				return nil
			end
		end
	end
end

local totalParts = 0

local function LoadMap(prt, parent)

	if prt:IsA("Model") then
		if #prt:GetChildren() > 0 then
			print("Model:", prt.Name, "Children:", #prt:GetChildren())
			local newmodel = Instance.new("Model")
			newmodel.Name = prt.Name
			newmodel.Parent = parent


			local searched = 0
			for _, prtChild in pairs(prt:GetChildren()) do
				totalParts = totalParts+1
				if searched % 300 == 0 then task.wait() end searched = searched + 1

				LoadMap(prtChild, newmodel)
			end
		end
	elseif prt:IsA("BasePart") or prt:IsA("MeshPart") or prt:IsA("Part") or prt:IsA("Union") then

		local cloneprt = prt:Clone()
		cloneprt.Anchored = true
		cloneprt.Parent = parent


		print("Cloned:", parent.Name)
	elseif prt:IsA("StringValue") then
		local cloneit = prt:Clone()
		cloneit.Parent = parent
	end

end

local function RemovePlayersTable()
	for i,v in ipairs(PS:GetPlayers()) do
		local char = v.Character
		local hum = char:FindFirstChildWhichIsA("Humanoid")

		if table.find(players, v.Name) then
			table.remove(players, table.find(players, v.Name))
		end
	end
end

local function CheckPlayers()
	--if checkPlayersAmount(PlayersToCheck) then

	for i,v in ipairs(PS:GetPlayers()) do
		local char = v.Character
		local hum = char:FindFirstChildWhichIsA("Humanoid")

		if not table.find(players, v.Name) then
			table.insert(players, v.Name)

			hum.Died:Connect(function()
				table.remove(players, table.find(players, v.Name))

				if #players == 0 then
					--gamestarted.Value = false
					--print("Everyone died")

				end
			end)
		end
	end
	--end
end

gamestarted.Value = false

function CleanBombs()

	
	task.spawn(function()
		for _, bombs in pairs(bombsfolderworks:GetChildren()) do
			bombs:Destroy()
			warn("bombs cleared")
		end
	end)
end

local bombFunctions = nil

local function RoundStart()

	if checkPlayersAmount(PlayersToCheck) then
		RemovePlayersTable()
		task.wait(0.15)
		for _, player in pairs(PS:GetPlayers()) do
			visualsr:FireClient(player, "stopRoundMusic")
		end

		for _, playerd in pairs(PS:GetPlayers()) do
			if (playerd) then
				local character = playerd.Character
				if (character:FindFirstChild("Humanoid") or character:FindFirstChildWhichIsA("Humanoid")) then
					local hum = character:WaitForChild("Humanoid") or character:FindFirstChildWhichIsA("Humanoid")
					if hum then
						if character:FindFirstChild("HealthV") then
							local healthValue = character:WaitForChild("HealthV")
							if healthValue:IsA("NumberValue") then
								healthValue.Value = 100
							end
						end
					end
				end
			end
		end

		CleanBombs() -- porseacaso

		spawnBombsLoop = coroutine.create(function()
			while true do

				task.wait(Seed:NextNumber(1, 10)*Seed:NextInteger(1, 1.5)/currentIntensity.Value + 1.35)

				local getbombsmodels = bombsfolderworks:GetChildren()
				local amountofmodels = #getbombsmodels
				if gamestarted.Value then
					if amountofmodels <= 15 then
						local x = newbombspawner.Position.X
						local z = newbombspawner.Position.Z

						local xS = newbombspawner.Size.X/2
						local zS = newbombspawner.Size.Z/2

						local pos1 = math.random(x-xS, x+xS)
						local pos2 = math.random(z-zS,z+zS)

						local rayOrigin = Vector3.new(pos1, newbombspawner.Position.Y, pos2)
						local rayDirection = Vector3.new(0, -500, 0)

						local raycasParams = RaycastParams.new()
						raycasParams.FilterType = Enum.RaycastFilterType.Exclude
						raycasParams.FilterDescendantsInstances = {newbombspawner}

						local raycastResult = workspace:Raycast(rayOrigin, rayDirection, raycasParams)

						if raycastResult then
							local randomSelect = SearchIn(bombModels, "", true)
							if randomSelect then
								if randomSelect:FindFirstChild("Model") then
									local ModelFolder = randomSelect:WaitForChild("Model")
									if ModelFolder then
										for _, models in pairs(ModelFolder:GetChildren()) do -- here i do the bomb spawning
											if models:IsA("Model") then
												local cloneBombModel = models:Clone()
												cloneBombModel.Parent = bombsfolderworks
												cloneBombModel:PivotTo(CFrame.new(raycastResult.Position + Vector3.new(0, Seed:NextNumber(50, 75), 0)))

												bombfunctions = requirebombFunctions.createbomb(cloneBombModel)
												bombfunctions:assignFunction()
													
											end
										end
									end
								end
							end
						end
					else

					end
				else
					CleanBombs()
				end


			end
		end)

		--		gamestarted.Value = false


		intermissionTime.Value = DefaultLobbyTime
		gamestatus.Value = "Intermission : "..FormatSeconds(intermissionTime.Value)

		--RoundWait(intermissionTime.Value)
		task.wait(1.8)

		print("intermission started")

		for _, player in pairs(PS:GetPlayers()) do
			if player then
				player:SetAttribute("Survived", false)
				visualsr:FireClient(player, "playLobbyMusic")

			end
		end

		for i = DefaultLobbyTime, 0, -1 do
			if intermissionTime.Value >= 0 then
				intermissionTime.Value = i
				gamestatus.Value = "Intermission : "..FormatSeconds(intermissionTime.Value)
				--print(lobbytime.Value)
				task.wait(1)
			end
		end

		print("intermission ended")


		local getmaps = mapFolder:GetChildren()

		local selectedMapRandom = getmaps[Seed:NextInteger(#getmaps, 1)]

		gamestatus.Value = "Loading Map : "..selectedMapRandom.Name..".."
		local borderclone = loadingmapborder:Clone()
		borderclone.Parent = workspace


		LoadMap(selectedMapRandom, InGameMapsFolder)
		task.wait(.1)
		for _, getmaps in pairs(InGameMapsFolder:GetChildren()) do
			if getmaps:IsA("Model") or getmaps:IsA("BasePart") then
				currentMap = getmaps
			end
		end
		if currentMap then
			print(currentMap:GetFullName())
			local PartsToWeld = currentMap:GetDescendants()
			local WeldPart = currentMap:WaitForChild("Primary") -- Insert main part to weld
			local Whitelist = WeldPart.Name
			--------------------------------
			for i, part in pairs(PartsToWeld) do
				local Weld = Instance.new("WeldConstraint")
				local success, errormessage = pcall(function()
					if part.Name ~= "Primary" then
						if part:IsA("Part") or part:IsA("BasePart") then
							Weld.Parent = part
							Weld.Name = "AutoWeld"
							Weld.Part0 = part
							Weld.Part1 = WeldPart
							if part.Name == Whitelist then 
								Weld.Part1 = script.Parent:FindFirstAncestorWhichIsA("Part")
							end
							part.Anchored = false
						end
					end
				end)
				if errormessage then
					warn("refWeld :: Error welding Part")
				end
			end
		end

		borderclone:Destroy()

		gamestatus.Value = "Starting Round "

		task.wait(2) -- loading map time

		CheckPlayers()

		print("round started")
		gamestatus.Value = ""
		gamestarted.Value = true
		task.wait(1.25)

		for _, playerd in pairs(PS:GetPlayers()) do
			if (playerd) then
				local character = playerd.Character
				if (character:FindFirstChild("Humanoid") or character:FindFirstChildWhichIsA("Humanoid")) then
					local hum = character:WaitForChild("Humanoid") or character:FindFirstChildWhichIsA("Humanoid")
					if hum then
						if playerd:GetAttribute("OnMenu") == false then
							if (hum.Health) > 0 then
								table.insert(activePlayers, playerd)

								connections[playerd.UserId.."Left"] = playerd.AncestryChanged:Connect(function()
									removePlayer(playerd)
								end)

								connections[playerd.UserId.."Died"] = hum.Died:Connect(function()
									removePlayer(playerd)
								end)


							end
						end
					end
				end
			end
		end

		for _, player in pairs(PS:GetPlayers()) do
			if player then
				if player:GetAttribute("OnMenu") == false then
					player:SetAttribute("Survived", true)
					local char = player.Character
					visualsr:FireClient(player, "showmaponce", tostring(currentMap.mapName.Value), tostring(currentMap.mapCreator.Value))
					local character = player.Character
					if (character:FindFirstChild("Humanoid") or character:FindFirstChildWhichIsA("Humanoid")) then
						local hum = character:WaitForChild("Humanoid") or character:FindFirstChildWhichIsA("Humanoid")
						if hum then
							if char:FindFirstChild("HumanoidRootPart") then
								hum.Jump = true
								local rootpart = char:WaitForChild("HumanoidRootPart")
								if currentMap:FindFirstChild("Primary") then
									rootpart.CFrame = currentMap.Primary.CFrame + Vector3.new(0.1, 2.5,  0)
								else
									rootpart.CFrame = currentMap:GetPivot() + Vector3.new(0.1, 1.4, 0)
								end

							end
						end
					end
				end
			end
		end


		local result = Seed:NextNumber(1, 5.05) 
		local convert = ("%.1f"):format(result) 
		local convertonumber = tonumber(convert) 
		if convertonumber > 5.0 then 
			convertonumber = 5.0 
		end 
		currentIntensity.Value = convertonumber  
		for _, player in pairs(PS:GetPlayers()) do
			visualsr:FireClient(player, "stopLobbyMusic")
		end
		workspace.Sounds["Bomb Fuse"]:Play()


		task.wait(3)

		for _, player in pairs(PS:GetPlayers()) do
			if (#activePlayers > 0) then
				visualsr:FireClient(player, "showIntensity")
			end
		end

		task.wait(4.2) -- wait for everything again

		roundtimeleft.Value = DefaultGameTime


		task.wait(.1)

		if spawnBombsLoop then
			coroutine.resume(spawnBombsLoop)
		end

		--roundtimeCoroutine = coroutine.create(function()
		print(table.unpack(activePlayers))

		for i = DefaultGameTime, 0, -1 do


			if roundtimeleft.Value >= 0 then
				roundtimeleft.Value = i
				--print(lobbytime.Value)
				task.wait(1)
			end

			if (#activePlayers == 0) then
				break
			end
			if roundtimeleft.Value <= 0 then
				roundtimeleft.Value = 0 
			end

		end
		print("round ended")

		for _, players in pairs(activePlayers) do
			if players then 
				if players.Character then
					if players.Character:FindFirstChild("HumanoidRootPart") then
						players.leaderstats.Insacoins.Value += 100
						players.leaderstats.Survivals.Value += 1
					end
				end
			end
		end
	end

	task.wait(.1)
	for _, remainingPlayer in pairs(activePlayers) do
		warn("round ended")
	end

	for _, connection in pairs(connections) do
		connection:Disconnect()
	end
	table.clear(activePlayers)
	if currentMap then
		currentMap:Destroy()
	end

	if spawnBombsLoop then
		coroutine.close(spawnBombsLoop)
	end
	task.wait(.1)
	CleanBombs()

	gamestarted.Value = false

	task.spawn(function()
		for _, player in pairs(PS:GetPlayers()) do
			if player then
				if player:GetAttribute("OnMenu") == false then
					player:SetAttribute("Survived", true)
					local char = player.Character
					local character = player.Character
					if (character:FindFirstChild("Humanoid") or character:FindFirstChildWhichIsA("Humanoid")) then
						local hum = character:WaitForChild("Humanoid") or character:FindFirstChildWhichIsA("Humanoid")
						if hum then
							if char:FindFirstChild("HumanoidRootPart") then
								hum.Jump = true
								local rootpart = char:WaitForChild("HumanoidRootPart")
								rootpart.Anchored = true
								task.wait(1.29)
								rootpart.Anchored = false
								rootpart.CFrame = CFrame.new(99.8232346, 4.5999999, -190.378067, 1, 0, 0, 0, 1, 0, 0, 0, 1) + Vector3.new(0.1, 1.4, 0)

							end
						end
					end
				end
			end
		end
	end)
	roundEndSting:Play()


	task.spawn(function()
		task.delay(0.25, function()
			for _, player in pairs(PS:GetPlayers()) do
				visualsr:FireClient(player, "stopRoundMusic")
			end
		end)
	end)


	task.wait(1)
	--	print("ended")
	--end)
	--coroutine.resume(roundtimeCoroutine)


	--print("round ended")
	--RoundWait(roundtimeStart.Value)
end

gamestarted:GetPropertyChangedSignal("Value"):Connect(function()
	if not gamestarted.Value then
		if roundtimeCoroutine then
			coroutine.close(roundtimeCoroutine)
		end
	end
end)


task.spawn(function()
	while true do
		if roundDebounce == false then
			task.wait(1.5)
			RoundStart()
		end
	end
end)

Bomb spawner module :

--ndya!!!!
local collectionService = game:GetService("CollectionService")
local BombTypesFolder = script:WaitForChild("BombTypes")

local system = {}
system.__index = system



function system.createbomb(bomb : model | Part | MeshPart)
	assert(bomb,"Argument 'bomb' is missing")

	local self = {}

	setmetatable(self,system)

	self.bombmodel = bomb

	return self
end

function system:assignFunction()
	
	--local tagFunctions = {
	--	classicBomb = function(object)

	-- descartado Muejejee!!

	--end,
	--}
	
	print("Loading")
	
	local tags = collectionService:GetTags(self.bombmodel)
	for _, tag in pairs(tags) do
		if tag then
			local get = system:getBombModule(tag, self.bombmodel)
			if get then
				local requirem = require(get)
				requirem(self.bombmodel, tag)
				print("Module for " .. self.bombmodel.Name or self.bombmodel:GetFullName().." Required Succesfully")
			else
				warn("Couldn't Find a Module for .. "..self.bombmodel.Name or self.bombmodel:GetFullName())
			end

			--local customFunction = tagFunctions[tag]
			--if customFunction then
			--customFunction(self.bombmodel)
			--end
		else
			return warn("Couldn't Find a Tag for .. "..self.bombmodel.Name or self.bombmodel:GetFullName())		
		end
	end
end

function system:getBombModule(tagname : string, object)
	for _, modules in pairs(BombTypesFolder:GetChildren()) do
		if modules:IsA("ModuleScript") then
			if modules.Name == tagname then
				return modules
			end
		end
	end
	return nil
end

return system

Classic bomb OOP Module

-- spook 6/04/24
local Seed = Random.new()
local bombclass = {}
local Replicated = game:GetService("ReplicatedStorage")
local SV = game:GetService("ServerStorage")
local bombfolder = SV:WaitForChild("BombModels")
local terrain = workspace.Terrain
local debrisService = game:GetService("Debris")
local libraries = Replicated:WaitForChild("Libraries")
local Zonemod = libraries:WaitForChild("Zone")
local requireZone = require(Zonemod)
local AssetsFolder = script:WaitForChild("Assets", 999)
local effectshandlerpart = AssetsFolder:WaitForChild("effectsHandler")
local TemporalFolder = workspace:WaitForChild("Temporal")
local collectionService = game:GetService("CollectionService")

local runSd = Replicated:WaitForChild("RunServiceTween")
local tPlus = Replicated:WaitForChild("TweenServicePlus")
local easyclientT = Replicated:WaitForChild("EasyClientTween")
local ReplicatedTweening = Replicated:WaitForChild("ReplicatedTweening")

local requireEasyTween = require(easyclientT)
local requireRunServ = require(runSd)
local requiretPlus = require(tPlus)
local requireTV2 = require(ReplicatedTweening)

local BombVisualRemote = Replicated:WaitForChild("BombVisual")


-- // ASSETS ZONE // --

local tickhighlight = AssetsFolder:WaitForChild("tickhighlight")
local tickeffectAttachment = effectshandlerpart:WaitForChild("tickeffect")
local explosionEffectAttachment = effectshandlerpart:WaitForChild("explosionEffect")
local explosionEffect2Attachment = effectshandlerpart:WaitForChild("explosioneffect2")
local ExpoEffect1Yellow = AssetsFolder:WaitForChild("expo1")
local ExpoEffect2Red = AssetsFolder:WaitForChild("expo2")


--///////////////////

local BombHandler = nil
local VerifyBombModel = nil

local BombClearEventHandler = nil

local settingsModule = {
	bombName = "classicbomb",
	TickTimeToExplode = 1.1,

	HitboxSize = Vector3.new(17, 17, 17.5),
	HitboxColor = Color3.fromRGB(173, 0, 0),
	HitboxTransparency = 0.5,
	HitboxOffset = Vector3.new(0, 0.1, 0),
	DebugHitbox = false,

	TimeToStartTicking = 5,
	DecreaseTickTimeCount = 0.2,
	TickSoundName = "",
	showHitbox = true,
	ExplosionSoundName = "",
	Damage = 10,
	DestroyWeldsChance = 50, -- porcentage 0.5
	DestroyPartsChance = 61, --porcentage 0.6
}

-- // Tween Information // --

local TweenInfos = {
	Expo1YellowSize = {TweenInfo.new(
		0.45,
		Enum.EasingStyle.Sine,
		Enum.EasingDirection.InOut
		)},
	Expo1YellowTransparency = {TweenInfo.new(
		1,
		Enum.EasingStyle.Sine,
		Enum.EasingDirection.InOut
		)},
	Expo2RedSize = {TweenInfo.new(
		0.55,
		Enum.EasingStyle.Sine,
		Enum.EasingDirection.InOut
		)},
	Expo2RedTransparency = {TweenInfo.new(
		0.4,
		Enum.EasingStyle.Sine,
		Enum.EasingDirection.InOut
		)},
}

local goals = {
	Shrink = {
		Size = Vector3.new(0.000, 0.000, 0.000),
	},
	Disappear = {
		Transparency = 1
	}
}



--//////

function bombclass:RandomChance(tabla)
	local Sum = 0

	for _, Table in ipairs(tabla) do
		Sum += Table.Chance
	end

	local RNG = Random.new():NextInteger(1, Sum)

	local Weight = 0

	for _, Table in ipairs(tabla) do
		Weight += Table.Chance
		if Weight >= RNG then
			return Table.Rarity
		end
	end
end


function bombclass:SearchIn(folder : Folder , name : string, selectRandom : boolean)
	if folder and folder:IsA("Folder") then
		if not selectRandom then
			for _, objects in pairs(folder:GetChildren()) do
				if objects then
					if folder:FindFirstChild(settingsModule.TickSoundName) then
						local getItem = folder:WaitForChild(settingsModule.TickSoundName)
						if getItem then
							return getItem
						end
					else
						return nil
					end
				end

			end
		else
			local getChildren = folder:GetChildren()
			local choosenitem = getChildren[Seed:NextInteger(1, #getChildren)]
			if choosenitem then
				return choosenitem
			else
				return nil
			end
		end
	end
end

function bombclass:EmitFromAttachment(attachment, amount)
	if attachment:IsA("Attachment") then
		for _, particles in pairs(attachment:GetChildren()) do
			if particles:IsA("ParticleEmitter") then
				particles:Emit(amount)
			end
		end
	end
end

function bombclass:DisableParticlesFromAttachment(attachment)
	if attachment:IsA("Attachment") then
		for _, particles in pairs(attachment:GetDescendants()) do
			if particles:IsA("ParticleEmitter") then
				particles.Enabled = false
			end
		end
	end
end

function bombclass:EnableFromAttachment(attachment : Attachment, duration : number)
	task.spawn(function()
		if attachment:IsA("Attachment") then
			for _, particles in pairs(attachment:GetChildren()) do
				if particles:IsA("ParticleEmitter") then
					if duration then
						particles.Enabled = true
						task.delay(duration, function()
							particles.Enabled = false
						end)
					else
						particles.Enabled = true
					end
				end
			end
		end
	end)
end




return function(bomb, selectedTag : string)
	task.spawn(function()
		local self = {}

		setmetatable(self, bombclass)


		self.bombModelVerify = bomb
		VerifyBombModel = self.bombModelVerify

		-- // Search folders
		self.specifiedBombFolder = nil
		self.SoundsFolderBomb = nil
		self.tickSoundsFolder = nil
		self.explosionsSoundFolder = nil
		-- /////

		self.settings = settingsModule


		self.CurrentTickSoundAttachment = nil
		self.CurrentTickSound = nil

		self.CurrentExplosionSoundAttachment = nil
		self.CurrentExplosionSound = nil
		self.Chances_1 = nil

		self.bombmeshorpart = nil



		if bomb:IsA("Model") then
			for _, bombparts in pairs(bomb:GetDescendants()) do
				if bombparts:FindFirstChild("IsBombPart") then
					local isbombpart = bombparts:WaitForChild("IsBombPart")
					if isbombpart:IsA("RayValue") then
						self.bombmeshorpart = bombparts
					end
				end
			end
		else
			self.bombmeshorpart = bomb
		end

		-- Put Assets .self here --
		task.wait()

		self.tickhighlight = nil
		self.tickattacheffect = nil
		self.bombExpEffectAttach = nil
		self.bombExpEffect2Attach = nil
		self.expoEffect1Yellow = nil
		self.expoEffect2Red = nil

		if self.bombmeshorpart then

			print(self.bombmeshorpart.Name)

			self.tickhighlight = tickhighlight:Clone()
			self.tickhighlight.Enabled = false

			self.tickattacheffect = tickeffectAttachment:Clone()

			self.tickhighlight.Parent = self.bombmeshorpart
			self.tickattacheffect.Parent = self.bombmeshorpart
			self.tickattacheffect.WorldCFrame = self.bombmeshorpart.CFrame
			bombclass:DisableParticlesFromAttachment(self.tickattacheffect)

			self.bombExpEffectAttach = explosionEffectAttachment:Clone()
			self.bombExpEffectAttach.Parent = self.bombmeshorpart
			self.bombExpEffectAttach.WorldCFrame = self.bombmeshorpart.CFrame		
			bombclass:DisableParticlesFromAttachment(self.bombExpEffectAttach)

			self.bombExpEffect2Attach = explosionEffect2Attachment:Clone()
			self.bombExpEffect2Attach.Parent = self.bombmeshorpart
			self.bombExpEffect2Attach.WorldCFrame = self.bombmeshorpart.CFrame		
			bombclass:DisableParticlesFromAttachment(self.bombExpEffect2Attach)

		else
			warn(" no set")
		end

		--////

		self.CurrentTime = self.settings["TickTimeToExplode"]


		if bombfolder:FindFirstChild(selectedTag) then
			self.specifiedBombFolder = bombfolder:WaitForChild(selectedTag)
			self.SoundsFolderBomb = self.specifiedBombFolder:WaitForChild("Sounds")
			self.tickSoundsFolder = self.SoundsFolderBomb:WaitForChild("ticks")
			self.explosionsSoundFolder = self.SoundsFolderBomb:WaitForChild("Explosions")
		end


		warn(settingsModule or table.unpack(settingsModule))

		task.wait()

		task.wait(settingsModule["TimeToStartTicking"])

		
		local BombHandler = coroutine.create(function()
			for count = self.settings["DecreaseTickTimeCount"] , 10 do
				if VerifyBombModel then
					if self.bombmeshorpart ~= nil and bomb ~= nil then
						print(self.bombmeshorpart:GetFullName())
						self.CurrentTime -= .1

						if bomb:IsA("BasePart") or bomb:IsA("MeshPart") or bomb:IsA("Part") then
							if self.tickhighlight then
								self.tickhighlight.Enabled = false
							end

							bomb.Color = Color3.fromRGB(255, 255, 255)

							task.wait(self.CurrentTime)

							if self.tickhighlight then
								self.tickhighlight.Enabled = true
							end

							if self.tickattacheffect then
								task.spawn(function()
									bombclass:EmitFromAttachment(self.tickattacheffect, Seed:NextInteger(1, 10))
								end)
							end

							bomb.Color = Color3.fromRGB(255, 0, 0)
						else


							if self.tickhighlight then
								self.tickhighlight.Enabled = false
							end


							task.wait(self.CurrentTime)

							if self.tickhighlight then
								self.tickhighlight.Enabled = true
							end

							if self.tickattacheffect then
								task.spawn(function()
									bombclass:EmitFromAttachment(self.tickattacheffect, Seed:NextInteger(1, 10))
								end)
							end


						end


						if self.specifiedBombFolder then
							if (settingsModule["TickSoundName"] == "") or (settingsModule["TickSoundName"] == nil) then
								local searchForSound = bombclass:SearchIn(self.tickSoundsFolder, nil, true)
								if searchForSound then
									self.CurrentTickSoundAttachment = Instance.new("Attachment")
									self.CurrentTickSoundAttachment.Parent = terrain
									if bomb:IsA("Part") or bomb:IsA("BasePart") or bomb:IsA("MeshPart") then
										self.CurrentTickSoundAttachment.CFrame = bomb.CFrame 
									else
										self.CurrentTickSoundAttachment.CFrame = bomb:GetPivot()
									end

									self.CurrentTickSound = searchForSound:Clone()
									self.CurrentTickSound.Parent = self.CurrentTickSoundAttachment
									self.CurrentTickSound:Play()
									debrisService:AddItem(self.CurrentTickSoundAttachment, self.CurrentTickSound.TimeLength)
								end
							else
								local searchForSound = bombclass:SearchIn(self.tickSoundsFolder, settingsModule["TickSoundName"], false)
								if searchForSound then
									self.CurrentTickSoundAttachment = Instance.new("Attachment")
									self.CurrentTickSoundAttachment.Parent = terrain
									if bomb:IsA("Part") or bomb:IsA("BasePart") or bomb:IsA("MeshPart") then
										self.CurrentTickSoundAttachment.CFrame = bomb.CFrame 
									else
										self.CurrentTickSoundAttachment.CFrame = bomb:GetPivot()
									end
									self.CurrentTickSound = searchForSound:Clone()
									self.CurrentTickSound.Parent = self.CurrentTickSoundAttachment
									self.CurrentTickSound:Play()
									debrisService:AddItem(self.CurrentTickSoundAttachment, self.CurrentTickSound.TimeLength)
								end
							end
						end

						task.wait(self.CurrentTime)
					end
				end
			end


			if self.tickattacheffect then
				self.tickattacheffect.Parent =	self.bombmeshorpart
				if self.bombmeshorpart then
					self.tickattacheffect.WorldCFrame = self.bombmeshorpart.CFrame
					debrisService:AddItem(self.tickattacheffect, 1.5)
				end
			end
			if self.bombExpEffectAttach then
				self.bombExpEffectAttach.Parent = terrain
				self.bombExpEffectAttach.WorldCFrame = self.bombmeshorpart.CFrame
				if self.bombmeshorpart then
					self.bombExpEffectAttach.WorldCFrame = self.bombmeshorpart.CFrame
					debrisService:AddItem(self.bombExpEffectAttach, 1.5)
				end
			end

			if self.bombExpEffect2Attach then
				self.bombExpEffect2Attach.Parent = terrain
				self.bombExpEffect2Attach.WorldCFrame = self.bombmeshorpart.CFrame
				if self.bombmeshorpart then
					self.bombExpEffect2Attach.WorldCFrame = self.bombmeshorpart.CFrame
					debrisService:AddItem(self.bombExpEffect2Attach, 1.5)
				end
			end

			if self.tickhighlight then
				self.tickhighlight:Destroy()
			end

			if self.bombExpEffect2Attach then
				bombclass:EmitFromAttachment(self.bombExpEffect2Attach, Seed:NextInteger(5 , 11))
			end
			if self.bombExpEffectAttach then
				bombclass:EnableFromAttachment(self.bombExpEffectAttach, 0.4)
			end

			self.expoEffect1Yellow = ExpoEffect1Yellow:Clone()
			self.expoEffect2Red = ExpoEffect2Red:Clone()

			if self.expoEffect1Yellow then
				self.expoEffect1Yellow.Parent = TemporalFolder
				self.expoEffect1Yellow.CFrame = self.bombmeshorpart.CFrame + Vector3.new(0,0.4,0)


			end
			if self.expoEffect2Red then
				self.expoEffect2Red.Parent = TemporalFolder
				self.expoEffect2Red.CFrame = self.bombmeshorpart.CFrame + Vector3.new(0,0.4,0)

				self.expoEffect2Red.Size = self.expoEffect1Yellow.Size + Vector3.new(0.55, 0.55, 0.55)

			end	

			task.wait(.1)

			--local ExpoEffect1YellowShrink = requireTV2:GetTweenObject(self.expoEffect1Yellow, TweenInfo.new(0.45, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut), {Size = Vector3.new(0,0,0)})
			local ExpoEffect1YellowTransparency = requireTV2:GetTweenObject(self.expoEffect1Yellow, TweenInfo.new(1, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut), {Transparency = 1})

			--local ExpoEffect2RedShrink = requireTV2:GetTweenObject(self.expoEffect2Red, TweenInfo.new(0.55, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut), {Size = Vector3.new(0,0,0)})
			local ExpoEffect2RedTransparency = requireTV2:GetTweenObject(self.expoEffect2Red, TweenInfo.new(0.4, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut), {Transparency = 1})

			local ExpoEffect1YellowShrink_ = requiretPlus.Construct(
				self.expoEffect1Yellow,
				self.expoEffect1Yellow,
				TweenInfo.new(
					0.45,
					Enum.EasingStyle.Sine,
					Enum.EasingDirection.InOut
				),
				{
					Size = Vector3.new(0,0,0)
				}


			)



			local ExpoEffect2RedShrink_ = requiretPlus.Construct(
				self.expoEffect2Red,
				self.expoEffect2Red,
				TweenInfo.new(
					0.55,
					Enum.EasingStyle.Sine,
					Enum.EasingDirection.InOut
				),
				{
					Size = Vector3.new(0,0,0)
				}


			)

			ExpoEffect1YellowShrink_:Play()
			ExpoEffect2RedShrink_:Play()

			--ExpoEffect2RedShrink:Play()
			ExpoEffect2RedTransparency:Play()

			--ExpoEffect1YellowShrink:Play()
			ExpoEffect1YellowTransparency:Play()

			debrisService:AddItem(self.expoEffect2Red, 1.5)
			debrisService:AddItem(self.expoEffect1Yellow, 1.6)

			if (settingsModule["ExplosionSoundName"] == "") or (settingsModule["ExplosionSoundName"] == nil) then
				local searchForSound = bombclass:SearchIn(self.explosionsSoundFolder, nil, true)
				if searchForSound then
					self.CurrentExplosionSoundAttachment = Instance.new("Attachment")
					self.CurrentExplosionSoundAttachment.Parent = terrain
					if bomb:IsA("Part") or bomb:IsA("BasePart") or bomb:IsA("MeshPart") then
						self.CurrentExplosionSoundAttachment.CFrame = bomb.CFrame 
					else
						self.CurrentExplosionSoundAttachment.CFrame = bomb:GetPivot()
					end

					self.CurrentExplosionSound = searchForSound:Clone()
					self.CurrentExplosionSound.Parent = self.CurrentExplosionSoundAttachment
					self.CurrentExplosionSound:Play()
					debrisService:AddItem(self.CurrentExplosionSound, self.CurrentExplosionSound.TimeLength)
					debrisService:AddItem(self.CurrentExplosionSoundAttachment, self.CurrentExplosionSound.TimeLength + 0.1)
				end
			else
				local searchForSound = bombclass:SearchIn(self.explosionsSoundFolder, settingsModule["ExplosionSoundName"], false)
				if searchForSound then
					self.CurrentExplosionSoundAttachment = Instance.new("Attachment")
					self.CurrentExplosionSoundAttachment.Parent = terrain
					if bomb:IsA("Part") or bomb:IsA("BasePart") or bomb:IsA("MeshPart") then
						self.CurrentExplosionSoundAttachment.CFrame = bomb.CFrame 
					else
						self.CurrentExplosionSoundAttachment.CFrame = bomb:GetPivot()
					end
					self.CurrentExplosionSound = searchForSound:Clone()
					self.CurrentExplosionSound.Parent = self.CurrentExplosionSoundAttachment
					self.CurrentExplosionSound:Play()
					debrisService:AddItem(self.CurrentExplosionSound, self.CurrentExplosionSound.TimeLength)
					debrisService:AddItem(self.CurrentExplosionSoundAttachment, self.CurrentExplosionSound.TimeLength + 0.1)
				end
			end

			local SphereHitbox = Instance.new("Part")
			SphereHitbox.Shape = Enum.PartType.Ball
			SphereHitbox.Parent = TemporalFolder
			SphereHitbox.Size = self.settings["HitboxSize"]
			SphereHitbox.Color = self.settings["HitboxColor"]
			SphereHitbox.CanCollide = false

			if self.settings["DebugHitbox"] == true then
				SphereHitbox.Transparency = self.settings["HitboxTransparency"] or 0.5
			else
				SphereHitbox.Transparency = 1
			end

			SphereHitbox.Anchored = true
			SphereHitbox.CFrame = self.bombmeshorpart.CFrame + self.settings["HitboxOffset"]

			local ZoneContainer = requireZone.new(SphereHitbox)

			local getthem = ZoneContainer:getParts()

			self.Chances_1 = {
				{Rarity = "DestroyWeld",     Chance = self.settings["DestroyWeldsChance"]};
				{Rarity = "DestroyPart",    Chance = self.settings["DestroyPartsChance"]};
			}

			ZoneContainer.playerEntered:Connect(function(player)
				if player then
					if player.Character then
						local character = player.Character
						if character then
							if character:FindFirstChild("Humanoid") or character:FindFirstChildWhichIsA("Humanoid") then
								local humanoid = character:WaitForChild("Humanoid") or character("Humanoid")
								if humanoid then
									if character:FindFirstChild("HealthV") then
										local healthValue = character:WaitForChild("HealthV")
										if healthValue:IsA("NumberValue") then
											healthValue.Value -= self.settings["Damage"]
										end
									end
								end
							end
						end
					end
				end
			end)

			if getthem then
				for _, part in pairs(getthem) do
					local tags = collectionService:GetTags(part)
					if not (part == SphereHitbox) then
						if not (part.Name == self.expoEffect1Yellow.Name) or (part.Name == self.expoEffect2Red.Name) then
							print(getthem)
							--if part.Name == "HumanoidRootPart" then
							--local parent = part.Parent
							--if parent:FindFirstChild("Humanoid") or parent:FindFirstChildWhichIsA("Humanoid") then
							--local humanoid = parent:WaitForChild("Humanoid") or parent:FindFirstChildWhichIsA("Humanoid")
							--if humanoid then
							--	if parent:FindFirstChild("HealthV") then
							--	local healthValue = parent:WaitForChild("HealthV")
							--if healthValue:IsA("NumberValue") then
							--	healthValue.Value -= self.settings["Damage"]
							--end
							--end
							--end
							--	end
							--end
							for _, tag in pairs(tags) do
								if tag then
									if tag == "candestroy" then
										if part:IsA("BasePart") or part:IsA("Part") then
											local IfRarity = bombclass:RandomChance(self.Chances_1)
											if IfRarity == "DestroyPart" then
												part:Destroy()
											elseif IfRarity == "DestroyWeld" then
												for _, welds in pairs(part:GetChildren()) do
													if welds then
														if welds:IsA("Weld") or welds:IsA("Motor6D") or welds:IsA("WeldConstraint") then
															welds:Destroy()
														end
													end
												end
											else
												warn("???!!!?!?!?! "..IfRarity)
											end
										end 
									end
								end
							end
						end
					end
				end
			end
			debrisService:AddItem(SphereHitbox, 0.3)	


			--BombVisualRemote:Fire( self.expoEffect1Yellow ,"tweenBombEffect1Yellow")
			--BombVisualRemote:Fire( self.expoEffect2Red ,"tweenBombEffect2Red")


			--local ExpoEffect1YellowShrink =
			--	requireEasyTween.new(
			--	self.expoEffect1Yellow, self.expoEffect1Yellow, TweenInfo.new(
			--	2, -- 0.45
			--	Enum.EasingStyle.Sine,
			--	Enum.EasingDirection.InOut
			--	)   ,goals["Shrink"]
			--)
			--local ExpoEffect1YellowDisappear = 
			--requireRunServ.Create(
			--	self.expoEffect1Yellow, self.expoEffect1Yellow,TweenInfo.new(
			--		2, -- 1
			--		Enum.EasingStyle.Sine,
			--		Enum.EasingDirection.InOut
			--	) , {Transparency = 1}
			--)
			--local ExpoEffect1RedShrink =
			--	requireRunServ.Create(
			--	self.expoEffect2Red, self.expoEffect2Red,TweenInfo.new(
			--		2, -- 0.55
			--		Enum.EasingStyle.Sine,
			--		Enum.EasingDirection.InOut
			--	) , goals["Shrink"]
			--)
			--local ExpoEffect1RedDisappear = 
			--requireRunServ.Create(
			--	self.expoEffect2Red, self.expoEffect2Red,TweenInfo.new(
			--	2, -- 0.4
			--	Enum.EasingStyle.Sine,
			--	Enum.EasingDirection.InOut
			--	) , {Transparency = 1}
			--	)


			--	tweenObject:TweenAllClients(self.expoEffect2Red, {
			--	TweenInfo.new(0.55, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut)}, {Size = Vector3.new(0.000, 0.000, 0.000)}
			--)
			--	tweenObject:TweenAllClients(self.expoEffect2Red, {
			--	TweenInfo.new(0.4, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut)}, {Transparency = 1}
			--)

			--ExpoEffect1YellowShrink:Play()
			--ExpoEffect1YellowDisappear:Play()

			--ExpoEffect1RedShrink:Play()
			--ExpoEffect1RedDisappear:Play()


			task.wait()

			bomb:Destroy()

		end)

		if BombHandler then
			coroutine.resume(BombHandler)
		end
	

		bomb.Destroying:Connect(function()
			if BombHandler then
				coroutine.close(BombHandler)
				for _, attachments in pairs(terrain:GetChildren()) do
					if attachments:IsA("Attachment") then
						attachments:Destroy()
					end
				end
			end
		end)

		return self

	end)

end

This is my jerarqy

image

iGNORE THE module called bomb spawner, i didn’t use it

I tried many ways to call a function called destroy on the bombs modules, but it didn’t work, and instead throw me a error like “module it’s not a function of index” or something like that, also i tried doing .Destroying Function on the bomb module, but it also didn’t work

image

3 Likes

So… what exactly is the issue? From what I can tell, you are using local functions - you need to assign them to the module and return them at the end.

local module = {}
module.__index = module

function module.something()
    --do stuff
end

return module
  1. [Create a ModuleScript: ModuleScripts are commonly placed in ServerScriptService when used by server-side scripts and ReplicatedStorage when used by client-side local scripts(Intro to Module Scripts | Documentation - Roblox Creator Hub)1.
local MyModule = {} -- Create a table to store functions and variables
-- Add a function to the module
function MyModule.myFunction()
    -- Your code here
end
return MyModule -- Return the module table
  1. Require the ModuleScript in Other Scripts: You can use the require() function to import the ModuleScript in other scripts](Intro to Module Scripts | Documentation - Roblox Creator Hub)1.
local MyModule = require(game.ServerScriptService.MyModule) -- Path to the ModuleScript
MyModule.myFunction() -- Call the function from the ModuleScript

Remember, changes made to the ModuleScript values in one script (like a server script) don’t affect the values for other scripts (like client scripts)
Also, avoid using _G for sharing variables between scripts

1 Like

The Issue is that when i do something like this on the oop bomb module

function bombclass:DestroyBomb()
      if  VerifyBombModel then
             VerifyBombModel:Destroy()
            -- make visual effects when destroying bomb , etc here
      end 
end

and then on the main round script i do

function CleanBombs()

	task.spawn(function()
		for _, bombs in pairs(BombTypesFolder:GetChildren()) do
			if bombs:IsA("ModuleScript") then
                local requireModule = require(bombs)
                requireModule:DestroyBomb()
			end
		end
	end)
end

CleanBombs()

It will not work, and instead throw a error, so i was wondering if there’s a better method to do what i am trying to achieve (or make it work, since it doesn’t)

Yeah i tried that

revised version of your DestroyBomb method:

function bombclass:DestroyBomb()
    if self.VerifyBombModel then
        self.VerifyBombModel:Destroy()
        -- make visual effects when destroying bomb, etc., here
    end
end

Next, for the CleanBombs function, you need to ensure that each ModuleScript returns an instance of bombclass.

local bombclass = {}
bombclass.__index = bombclass

function bombclass.new(model)
    local self = setmetatable({}, bombclass)
    self.VerifyBombModel = model
    return self
end

function bombclass:DestroyBomb()
    if self.VerifyBombModel then
        self.VerifyBombModel:Destroy()
        -- make visual effects when destroying bomb, etc., here
    end
end

return bombclass

And then, in your main script, you would require the module and create an instance before calling DestroyBomb:

function CleanBombs()
    task.spawn(function()
        for _, bombModule in pairs(BombTypesFolder:GetChildren()) do
            if bombModule:IsA("ModuleScript") then
                local bombClass = require(bombModule)
                local bombInstance = bombClass.new(bombModel) -- You need to pass the bomb model here
                bombInstance:DestroyBomb()
            end
        end
    end)
end

CleanBombs()

replace bombModel with the actual model

That might work, but now i ran into a problem

Since i am spawning bombs on another function, how could i combine these two?, because i need to call the clean bomb functions when the round ends

if raycastResult then
							local randomSelect = SearchIn(bombModels, "", true)
							if randomSelect then
								if randomSelect:FindFirstChild("Model") then
									local ModelFolder = randomSelect:WaitForChild("Model")
									if ModelFolder then
										for _, models in pairs(ModelFolder:GetChildren()) do -- here i do the bomb spawning
											if models:IsA("Model") then
												local cloneBombModel = models:Clone()
												cloneBombModel.Parent = bombsfolderworks
												cloneBombModel:PivotTo(CFrame.new(raycastResult.Position + Vector3.new(0, Seed:NextNumber(50, 75), 0)))

												bombfunctions = requirebombFunctions.createbomb(cloneBombModel)
												bombfunctions:assignFunction()
													
											end
										end
									end
								end
							end
2 Likes

use a table to keep track of all the bomb instances created during the round. This way, when the round ends, you can iterate through the table and call the DestroyBomb method on each instance.

1 Like

So i would need to clean the table also when the round ends?, and should i add the bomb instance, or the bombfunctions one?, i wonder if you can save variables on tables

-- Table to keep track of all bomb instances
local activeBombs = {}

function SpawnBombs(raycastResult)
    -- your existing bomb spawning code 
    -- Add the bombfunctions instance to the activeBombs table
    table.insert(activeBombs, bombfunctions)
end

function CleanBombs()
    -- Iterate through the activeBombs table and destroy each bomb
    for _, bombInstance in ipairs(activeBombs) do
        bombInstance:DestroyBomb()
    end
    -- Clear the table for the next round
    activeBombs = {}
end

-- Call CleanBombs when the round ends
CleanBombs()

Can i insert a veriable instead of a instance into the table?

you can insert a variable but i feel like the instance might be better in the case scenario check ur game elements first

1 Like

You should look into _G and SharedTable. You can insert values that persist across scripts (on the same machine).

1 Like

Yeah, but in this case i would need to add some visuals effects and different ones for some custom bombs, so just destroying the instances won’t do something, soo alright ,i will try doing that, i’ll notice you

i dont know why its off topic but i just randomly got the interest of wanting to create a cframe node cart game wanna do it with me lol…

1 Like

yeah sure, why not

This text will be blurred

1 Like

just from quickly skimming the title have you tried using shared?

one script:
shared.Module = require(modulePath)

other scripts:
module = shared.Module

I Was thinking on doing that, but in my case i don’t think it’s good, since i am creating many variables at the same time and then with them doing new bombs, so if i want to clear them all, i would’ve need to do a table as @RobloxHasTalentR said, or something else

ok update so far i got the mine cart rails and a node system cframe

1 Like

careful, SharedTable is used for parallel lua. You may be confusing this with the global shared.

if you had a table within the modulescript like
local bombs = {}

you could create helper methods such as clearBombs(). Since you’re only requiring the modulescript once, the tables won’t be duplicated.