Hi other developers,
I’ve been running into the problem where I can’t set a variable inside an if statement.
code below;
if NormEnemyNumberSize > 0 then
local NewNormalEnemy = EnemyStatsModule.Normal.NormEnemy:Clone()
end
if FastEnemyNumberSize > 0 then
local NewNormalEnemy = EnemyStatsModule.Fast.FastEnemy:Clone()
end
if StrongEnemyNumberSize > 0 then
local NewNormalEnemy = EnemyStatsModule.Strong.StrongEnemy:Clone()
end
Assuming I understand you correctly, you would pre-create the variable before the if-statement.
local NewNormalEnemy = nil -- Variable is pre-defined and can be set later
if NormEnemyNumberSize > 0 then
NewNormalEnemy = EnemyStatsModule.Normal.NormEnemy:Clone()
end
if FastEnemyNumberSize > 0 then
NewNormalEnemy = EnemyStatsModule.Fast.FastEnemy:Clone()
end
if StrongEnemyNumberSize > 0 then
NewNormalEnemy = EnemyStatsModule.Strong.StrongEnemy:Clone()
end
I have already tried that, it comes back with: Players.Blumaimn.PlayerGui.Waves.EnemyLocalScript:34: attempt to compare number < nil
Ill give u the whole script maybe that will help:
local WaveScreenGUI = script.Parent
local TextLabel = WaveScreenGUI:WaitForChild("TextLabel")
local WaveNumber = 1
local ReplicatedStorage = game:GetService("ReplicatedStorage")
TextLabel.Text = "Wave " .. WaveNumber
task.wait(2)
local EnemyFolder = ReplicatedStorage:WaitForChild("Enemy")
local EnemyStatsModule = require(EnemyFolder:WaitForChild("EnemyStats"))
local TPLocation = game.Workspace:WaitForChild("SpawnPart")
local TweenService = game:GetService("TweenService")
local MovementTargetsFolder = game.Workspace:WaitForChild("Movement")
local TargetFirst = MovementTargetsFolder:WaitForChild("Target 1")
local TargetSecond = MovementTargetsFolder:WaitForChild("Target 2")
local TargetThird = MovementTargetsFolder:WaitForChild("Target 3")
local TargetFourth = MovementTargetsFolder:WaitForChild("Target 4")
local NewNormalEnemy = nil
local EnemyFolder = Instance.new("Folder")
EnemyFolder.Name = "Enemies"
EnemyFolder.Parent = game
.Workspace
local EnemyID = 0
local NewNormalEnemy = nil
local function SpawnEnemy(EnemyID, FastEnemyNumberSize, NormEnemyNumberSize, StrongEnemyNumberSize)
EnemyID += 1
if NormEnemyNumberSize > 0 then
local NewNormalEnemy = EnemyStatsModule.Normal.NormEnemy:Clone()
end
if FastEnemyNumberSize > 0 then
local NewNormalEnemy = EnemyStatsModule.Fast.FastEnemy:Clone()
end
if StrongEnemyNumberSize > 0 then
local NewNormalEnemy = EnemyStatsModule.Strong.StrongEnemy:Clone()
end
print(NewNormalEnemy)
NewNormalEnemy.Parent = EnemyFolder
NewNormalEnemy.CFrame = TPLocation.CFrame + Vector3.new(0, 0.5, 0)
NewNormalEnemy.Name = tostring(EnemyID)
print(TargetFirst.Position)
print(NewNormalEnemy)
local NormEnemyInfo = TweenInfo.new(EnemyStatsModule.Normal.Speed, Enum.EasingStyle.Linear, Enum.EasingDirection.Out, 0, false)
local MoveEnemy = TweenService:Create(NewNormalEnemy, NormEnemyInfo, {Position = TargetFirst.Position})
local MoveEnemy2 = TweenService:Create(NewNormalEnemy, NormEnemyInfo, {Position = TargetSecond.Position})
local MoveEnemy3 = TweenService:Create(NewNormalEnemy, NormEnemyInfo, {Position = TargetThird.Position})
local MoveEnemy4 = TweenService:Create(NewNormalEnemy, NormEnemyInfo, {Position = TargetFourth.Position})
MoveEnemy:Play()
MoveEnemy.Completed:Wait()
MoveEnemy:Cancel()
MoveEnemy2:Play()
MoveEnemy2.Completed:Wait()
MoveEnemy2:Cancel()
MoveEnemy3:Play()
MoveEnemy3.Completed:Wait()
MoveEnemy3:Cancel()
MoveEnemy4:Play()
MoveEnemy4.Completed:Wait()
MoveEnemy4:Cancel()
end
local function Waves(FastEnemyNumberSize, NormEnemyNumberSize, StrongEnemyNumberSize)
while true do
TextLabel.Text = "Wave " .. WaveNumber
if WaveNumber == 1 then
NormEnemyNumberSize = 10
for i=1, tonumber(NormEnemyNumberSize) do
spawn(function()
SpawnEnemy(0)
end)
task.wait(2)
end
WaveNumber += 1
elseif WaveNumber == 2 then
NormEnemyNumberSize = 12
FastEnemyNumberSize = 3
for i=1, tonumber(NormEnemyNumberSize, FastEnemyNumberSize) do
spawn(function()
SpawnEnemy(0)
end)
end
end
task.wait()
end
end
Waves()
if NormEnemyNumberSize > 0 then
NewNormalEnemy = EnemyStatsModule.Normal.NormEnemy:Clone()
end
if FastEnemyNumberSize > 0 then
NewNormalEnemy = EnemyStatsModule.Fast.FastEnemy:Clone()
end
if StrongEnemyNumberSize > 0 then
NewNormalEnemy = EnemyStatsModule.Strong.StrongEnemy:Clone()
end
and not this:
if NormEnemyNumberSize > 0 then
local NewNormalEnemy = EnemyStatsModule.Normal.NormEnemy:Clone()
end
if FastEnemyNumberSize > 0 then
local NewNormalEnemy = EnemyStatsModule.Fast.FastEnemy:Clone()
end
if StrongEnemyNumberSize > 0 then
local NewNormalEnemy = EnemyStatsModule.Strong.StrongEnemy:Clone()
end
One slightly easier way to do this is to do it in one line of code. Like this:
newNormalEnemy = (StrongEnemyNumberSize > 0) and (EnemyStatsModule.Strong.StrongEnemy:Clone()) or ((FastEnemyNumberSize > 0) and (EnemyStatsModule.Fast.FastEnemy:Clone()) or ((NormEnemyNumberSize > 0) and (EnemyStatsModule.Normal.NormEnemy:Clone()) or (newNormalEnemy)))
I don’t really know how to explain how this works. But it just does. It’s a special type of if statement that you put inside of a variable, but I don’t remember what it is called.
Edit: I think I remember now. I think it’s called a “ternary operator” or a “ternary if statement”. I might be wrong though.