I have a script that checks a list of disasters to see which one is selectable
Then uses table.insert() to insert the disaster name in a table if it is
Script:
local AvailableMaps = {}
for i, disaster in pairs(Disasters) do
-- Check enabled
if disaster.Enabled == false then return end
-- Check map specific
if disaster.isMapSpecific == true then
if workspace.Map.Map_Name.Value ~= disaster.SpecificMap then return end
end
-- Check if only unique map disasters
if UniqueMapDisastersOnly == true then
if workspace.Map.Map_Name.Value ~= disaster.SpecificMap then return end
end
-- Add disaster to table
table.insert(AvailableMaps, disaster.Name)
for i, v in pairs(AvailableMaps) do
print(v) -- This prints correctly the disasters
end
end
for i, v in pairs(AvailableMaps) do
print(v) -- this doesn't print anything
end
Although the table “AvailableMaps” is outside the for loop, printing the things inside the table in the for loops does return the desired disasters, but doing it outside doesn’t print anything, it returns nil
Is there something removing data outside the for loop? If not then maybe try this work around:
1.Create a folder inside the script
2.Create a stringvalue inside the folder with a value of the disaster’s name everytime you add
a disaster’s name
(Optional)
3.Delete all the string value inside the folder if no longer needed.
There is no clear reason why your script is not working, could you show the Disaster table?
Just to give a simple example this reduced code does the same as yours and yes it SHOULD work:
local AvailableMaps = {}
local Disasters = {
["Disaster1"] = {Enabled = true, Name = "doom"},
["Disaster2"] = {Enabled = true, Name = "fire from sky"},
["Disaster3"] = {Enabled = true, Name = "tacos from sky"},
}
for i, disaster in pairs(Disasters) do
-- Check enabled
if disaster.Enabled == false then return end
-- Add disaster to table
warn("going to add:", disaster.Name)
table.insert(AvailableMaps, disaster.Name)
end
-- Print the table
for i, v in pairs(AvailableMaps) do
print(v)
end
To me, I dont like to use intValues, stringValues everywhere in folders and stuff. Don’t give up with your table based approach, tables are pretty handy
I’ll explain further, every second ingame the Disaster Event is fired, then in another script, there’s a connection to the event and in that script there is a 20% chance of ocurring (right now its 100% for testing purposes), now here comes the problem part, there’s a custom function to get a random disaster which is the one you see, I’ll show it here:
local function GetRandomDisaster()
local SelectedDisaster = nil
local SelectedDisasterName = nil
AvailableMaps = {}
for i, disaster in pairs(Disasters) do
-- Check enabled
if disaster.Enabled == false then return end
-- Check map specific
if disaster.isMapSpecific == true then
if workspace.Map.Map_Name.Value ~= disaster.SpecificMap then return end
end
-- Check if only unique map disasters
if UniqueMapDisastersOnly == true then
if workspace.Map.Map_Name.Value ~= disaster.SpecificMap then return end
end
-- Add disaster to table
table.insert(AvailableMaps, disaster.Name)
for i, v in pairs(AvailableMaps) do
print(v) -- THIS PRINTS "TORNADO"
end
task.wait(2)
end
task.wait(3)
for i, v in pairs(AvailableMaps) do
print(v) -- THIS DOESN'T PRINT ANYTHING
end
SelectedDisaster = AvailableMaps[math.random(1, #AvailableMaps)]
SelectedDisasterName = SelectedDisaster.Name
return SelectedDisaster, SelectedDisasterName
end
Well, I don’t know why it wasn’t working but I fixed it by not using "then return end"
Code:
local function GetRandomDisaster()
local SelectedDisaster = nil
local SelectedDisasterName = nil
AvailableMaps = {}
for i, disaster in pairs(Disasters) do
local map_Enabled = false
local map_MatchSpecific = true
local map_MatchUnique = true
-- Check enabled
if disaster.Enabled == true then
map_Enabled = true
end
-- Check map specific
if disaster.isMapSpecific == true then
if workspace.Map.Map_Name.Value ~= disaster.SpecificMap then
map_MatchSpecific = false
end
end
-- Check if only unique map disasters
if UniqueMapDisastersOnly == true then
if workspace.Map.Map_Name.Value ~= disaster.SpecificMap then
map_MatchUnique = false
end
end
-- Add disaster to table
if map_Enabled and map_MatchSpecific and map_MatchUnique then
table.insert(AvailableMaps, disaster.Name)
end
end
task.wait(3)
for i, v in pairs(AvailableMaps) do
print(v) -- NOW THIS PRINTS ALL THE DISASTERS
end
SelectedDisaster = AvailableMaps[math.random(1, #AvailableMaps)]
SelectedDisasterName = SelectedDisaster.Name
return SelectedDisaster, SelectedDisasterName
end