EnemyConfig is not a valid member

okay i’ve been stuck on this for hours, so my enemy works fine until it is respawned, once it respawns it just keeps giving me EnemyConfig is not a valid member of Model “FakeGrazill” - Server - EnemyMain:21 it does this no matter what i try so i need some guidance please.

local EnemiesFolder = workspace.Enemies
local EnemyTable = {}
local Enemies = EnemiesFolder:GetChildren()



--Services
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local CollectionService = game:GetService("CollectionService")

local function MainScript()
	wait(1)
	for _,v in pairs(Enemies) do
		print(Enemies)

		table.insert(EnemyTable, v)


		--Calling Module
		local EnemyConfig = require(v.EnemyConfig)


		--Variables
		local Enemy = v
		local EnemyHumanoid = Enemy.Humanoid
		local EnemyHumanoidRootPart = Enemy.HumanoidRootPart
		local EnemySpawnSpot = Enemy.SpawnSpot

		local AttackCoolDown = false

		--ModuleVariables
		local Health = EnemyConfig.Health
		local WalkSpeed = EnemyConfig.WalkSpeed
		local JumpPower = EnemyConfig.JumpPower

		local Damage = EnemyConfig.Damage
		local FollowDistance = EnemyConfig.FollowDistance
		local RespawnTime = EnemyConfig.RespawnTime

		local Range = EnemyConfig.Range

		local Gold = EnemyConfig.Rewards.Gold
		local EXP = EnemyConfig.Rewards.EXP

		--Animations

		local Animator = Instance.new("Animator")
		Animator.Parent = EnemyHumanoid

		local AttackAnimationID = EnemyConfig.AttackAnimationID
		local AttackAnimation = Instance.new("Animation")
		AttackAnimation.Parent = Enemy.Humanoid
		AttackAnimation.Name = "AttackAnimation"
		AttackAnimation.AnimationId = AttackAnimationID
		local AttackAnimationTrack = EnemyHumanoid.Animator:LoadAnimation(AttackAnimation)

		local WalkAnimationID = EnemyConfig.WalkAnimationID
		local WalkAnimation = Instance.new("Animation")
		WalkAnimation.Parent = Enemy.Humanoid
		WalkAnimation.Name = "WalkAnimation"
		WalkAnimation.AnimationId = WalkAnimationID
		local WalkAnimationTrack = EnemyHumanoid.Animator:LoadAnimation(WalkAnimation)

		local IdleAnimationID = EnemyConfig.IdleAnimationID
		local IdleAnimation = Instance.new("Animation")
		IdleAnimation.Parent = Enemy.Humanoid
		IdleAnimation.Name = "IdleAnimation"
		IdleAnimation.AnimationId = IdleAnimationID
		local IdleAnimationTrack = EnemyHumanoid.Animator:LoadAnimation(IdleAnimation)

		--Sounds
		local AttackSoundID = EnemyConfig.AttackSoundID
		local AttackSound = Instance.new("Sound")
		AttackSound.Name = "AttackSound"
		AttackSound.Parent = Enemy
		AttackSound.SoundId = AttackSoundID



		--AssigningStats 
		EnemyHumanoid.MaxHealth = Health
		EnemyHumanoid.Health = Health
		EnemyHumanoid.WalkSpeed = WalkSpeed
		EnemyHumanoid.JumpPower = JumpPower

		EnemyHumanoidRootPart:SetNetworkOwner(nil)

		local PlayerTable = {}

		local AtSpawnPoint = false

		--PlayWalkingAnimation
		local function PlayWalkAnimation()
			local Humanoid_State = EnemyHumanoid:GetState()
			if Humanoid_State == Enum.HumanoidStateType.Running then
				if WalkAnimationTrack.IsPlaying then
					return
				end
				WalkAnimationTrack:Play()
			elseif Humanoid_State == Enum.HumanoidStateType.None then
				local RunningAnimations = EnemyHumanoid:GetPlayingAnimationTracks()
				for i, Animation in pairs(RunningAnimations) do
					if Animation.IsPlaying == true then
						Animation:Stop()
					end	
				end
			end
		end
		--Moving Enemy Function
		local function MoveEnemy()
			local Target = nil
			local PlayersInGame = Players:GetPlayers()
			for _,Player in pairs(PlayersInGame) do
				local Character = Player.Character
				if Character then
					local CharacterHumanoidRootPart = Character:FindFirstChild("HumanoidRootPart")

					if CharacterHumanoidRootPart  and (EnemyHumanoidRootPart.Position - CharacterHumanoidRootPart.Position).Magnitude < Range then
						if Target then
							if (EnemyHumanoidRootPart.Position - Target.Position).Magnitude > (EnemyHumanoidRootPart.Position - CharacterHumanoidRootPart.Position).Magnitude then
								Target = CharacterHumanoidRootPart
							end
						else
							Target = CharacterHumanoidRootPart
							PlayWalkAnimation()
							IdleAnimationTrack:Stop()

							--Put Players Into Reward Table
							if table.find(PlayerTable, Target.Parent) then
							else
								table.insert(PlayerTable, Target.Parent)
							end

						end
					end
				end
				--Stop Moving
				if  Target == nil then

					if IdleAnimationTrack.IsPlaying then
					else
						IdleAnimationTrack:Play()
						WalkAnimationTrack:Stop()
						wait(5)
						--TP Back
						if WalkAnimationTrack.IsPlaying then

						else

							if Target == nil then
								if AtSpawnPoint == true and Target == nil then
									AtSpawnPoint = false


									EnemyHumanoidRootPart.CFrame = EnemySpawnSpot.CFrame
								end
							end
						end
					end
				end
			end
			if Target then
				EnemyHumanoid:MoveTo(Target.Position)
			end

			local Humanoid_State = EnemyHumanoid:GetState()

		end
		--Attack Player
		Enemy.HitBox.Touched:Connect(function(Hit)

			if Hit.Parent:FindFirstChild("Humanoid") then
				if Hit.Parent:HasTag("Enemy") then
				else
					if AttackCoolDown == false then
						AttackCoolDown = true
						AttackSound:Play()
						AttackAnimationTrack:Play()
						Enemy.HitBox.CanTouch = false
						local Humanoid = Hit.Parent.Humanoid
						Humanoid.Health = Humanoid.Health - Damage
					end
				end
			end
			if AttackCoolDown == true then
				task.wait(2)
				AttackCoolDown = false
				Enemy.HitBox.CanTouch = true
			end

		end)

		Enemy.SpawnSpot.Touched:Connect(function(Hit)
			if Hit.Parent == Enemy then
				EnemyHumanoid:ChangeState(Enum.HumanoidStateType.PlatformStanding)
				WalkAnimationTrack:Stop()
				AtSpawnPoint = true
				if IdleAnimationTrack.IsPlaying then

				else
					IdleAnimationTrack:Play()
				end
			end
		end)
		
		local EnemyClone = Enemy:Clone()
		--When Health = 0 
		EnemyHumanoid.Died:Connect(function() 
			task.wait(1) 
			EnemyClone.Parent = EnemiesFolder
			Enemy:Destroy() 
			table.remove(EnemyTable, table.find(EnemyTable, Enemy))
			print(EnemyTable)
		end)
		RunService.Stepped:Connect(MoveEnemy)
		
		EnemiesFolder.ChildAdded:Connect(function(ClonedEnemy)
			MainScript()
			table.insert(EnemyTable, ClonedEnemy)
			print(EnemyTable)
		end)
	end
end

MainScript()
	

try this as a debug for now:

local EnemiesFolder = workspace.Enemies
local EnemyTable = {}
local Enemies = EnemiesFolder:GetChildren()

--Services
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local CollectionService = game:GetService("CollectionService")

local function MainScript()
	wait(1)
	for _,v in Enemies do
		print(Enemies)
		table.insert(EnemyTable, v)
		--Calling Module
		if not v:FindFirstChild("EnemyConfig") then
			warn("Missing EnemyConfigs for:", v:GetFullName(), v:GetChildren(), v)
			continue
		end
		
		local EnemyConfig = require(v.EnemyConfig)
		--Variables
		local Enemy = v
		local EnemyHumanoid = Enemy.Humanoid
		local EnemyHumanoidRootPart = Enemy.HumanoidRootPart
		local EnemySpawnSpot = Enemy.SpawnSpot

		local AttackCoolDown = false

		--ModuleVariables
		local Health = EnemyConfig.Health
		local WalkSpeed = EnemyConfig.WalkSpeed
		local JumpPower = EnemyConfig.JumpPower

		local Damage = EnemyConfig.Damage
		local FollowDistance = EnemyConfig.FollowDistance
		local RespawnTime = EnemyConfig.RespawnTime

		local Range = EnemyConfig.Range

		local Gold = EnemyConfig.Rewards.Gold
		local EXP = EnemyConfig.Rewards.EXP

		--Animations

		local Animator = Instance.new("Animator")
		Animator.Parent = EnemyHumanoid

		local AttackAnimationID = EnemyConfig.AttackAnimationID
		local AttackAnimation = Instance.new("Animation")
		AttackAnimation.Parent = Enemy.Humanoid
		AttackAnimation.Name = "AttackAnimation"
		AttackAnimation.AnimationId = AttackAnimationID
		local AttackAnimationTrack = EnemyHumanoid.Animator:LoadAnimation(AttackAnimation)

		local WalkAnimationID = EnemyConfig.WalkAnimationID
		local WalkAnimation = Instance.new("Animation")
		WalkAnimation.Parent = Enemy.Humanoid
		WalkAnimation.Name = "WalkAnimation"
		WalkAnimation.AnimationId = WalkAnimationID
		local WalkAnimationTrack = EnemyHumanoid.Animator:LoadAnimation(WalkAnimation)

		local IdleAnimationID = EnemyConfig.IdleAnimationID
		local IdleAnimation = Instance.new("Animation")
		IdleAnimation.Parent = Enemy.Humanoid
		IdleAnimation.Name = "IdleAnimation"
		IdleAnimation.AnimationId = IdleAnimationID
		local IdleAnimationTrack = EnemyHumanoid.Animator:LoadAnimation(IdleAnimation)

		--Sounds
		local AttackSoundID = EnemyConfig.AttackSoundID
		local AttackSound = Instance.new("Sound")
		AttackSound.Name = "AttackSound"
		AttackSound.Parent = Enemy
		AttackSound.SoundId = AttackSoundID



		--AssigningStats 
		EnemyHumanoid.MaxHealth = Health
		EnemyHumanoid.Health = Health
		EnemyHumanoid.WalkSpeed = WalkSpeed
		EnemyHumanoid.JumpPower = JumpPower

		EnemyHumanoidRootPart:SetNetworkOwner(nil)

		local PlayerTable = {}

		local AtSpawnPoint = false

		--PlayWalkingAnimation
		local function PlayWalkAnimation()
			local Humanoid_State = EnemyHumanoid:GetState()
			if Humanoid_State == Enum.HumanoidStateType.Running then
				if WalkAnimationTrack.IsPlaying then
					return
				end
				WalkAnimationTrack:Play()
			elseif Humanoid_State == Enum.HumanoidStateType.None then
				local RunningAnimations = EnemyHumanoid:GetPlayingAnimationTracks()
				for i, Animation in pairs(RunningAnimations) do
					if Animation.IsPlaying == true then
						Animation:Stop()
					end	
				end
			end
		end
		--Moving Enemy Function
		local function MoveEnemy()
			local Target = nil
			local PlayersInGame = Players:GetPlayers()
			for _,Player in pairs(PlayersInGame) do
				local Character = Player.Character
				if Character then
					local CharacterHumanoidRootPart = Character:FindFirstChild("HumanoidRootPart")

					if CharacterHumanoidRootPart  and (EnemyHumanoidRootPart.Position - CharacterHumanoidRootPart.Position).Magnitude < Range then
						if Target then
							if (EnemyHumanoidRootPart.Position - Target.Position).Magnitude > (EnemyHumanoidRootPart.Position - CharacterHumanoidRootPart.Position).Magnitude then
								Target = CharacterHumanoidRootPart
							end
						else
							Target = CharacterHumanoidRootPart
							PlayWalkAnimation()
							IdleAnimationTrack:Stop()

							--Put Players Into Reward Table
							if table.find(PlayerTable, Target.Parent) then
							else
								table.insert(PlayerTable, Target.Parent)
							end

						end
					end
				end
				--Stop Moving
				if  Target == nil then

					if IdleAnimationTrack.IsPlaying then
					else
						IdleAnimationTrack:Play()
						WalkAnimationTrack:Stop()
						wait(5)
						--TP Back
						if WalkAnimationTrack.IsPlaying then

						else

							if Target == nil then
								if AtSpawnPoint == true and Target == nil then
									AtSpawnPoint = false


									EnemyHumanoidRootPart.CFrame = EnemySpawnSpot.CFrame
								end
							end
						end
					end
				end
			end
			if Target then
				EnemyHumanoid:MoveTo(Target.Position)
			end

			local Humanoid_State = EnemyHumanoid:GetState()

		end
		--Attack Player
		Enemy.HitBox.Touched:Connect(function(Hit)

			if Hit.Parent:FindFirstChild("Humanoid") then
				if Hit.Parent:HasTag("Enemy") then
				else
					if AttackCoolDown == false then
						AttackCoolDown = true
						AttackSound:Play()
						AttackAnimationTrack:Play()
						Enemy.HitBox.CanTouch = false
						local Humanoid = Hit.Parent.Humanoid
						Humanoid.Health = Humanoid.Health - Damage
					end
				end
			end
			if AttackCoolDown == true then
				task.wait(2)
				AttackCoolDown = false
				Enemy.HitBox.CanTouch = true
			end

		end)

		Enemy.SpawnSpot.Touched:Connect(function(Hit)
			if Hit.Parent == Enemy then
				EnemyHumanoid:ChangeState(Enum.HumanoidStateType.PlatformStanding)
				WalkAnimationTrack:Stop()
				AtSpawnPoint = true
				if IdleAnimationTrack.IsPlaying then

				else
					IdleAnimationTrack:Play()
				end
			end
		end)

		local EnemyClone = Enemy:Clone()
		--When Health = 0 
		EnemyHumanoid.Died:Connect(function() 
			task.wait(1) 
			EnemyClone.Parent = EnemiesFolder
			Enemy:Destroy() 
			table.remove(EnemyTable, table.find(EnemyTable, Enemy))
			print(EnemyTable)
		end)
		RunService.Stepped:Connect(MoveEnemy)

		EnemiesFolder.ChildAdded:Connect(function(ClonedEnemy)
			MainScript()
			table.insert(EnemyTable, ClonedEnemy)
			print(EnemyTable)
		end)
	end
end

MainScript()

I have a feeling you just need to yield for it using WaitForChild

i did try using WaitForChild, it ended up giving me infinite yield possible, but i’ll try your script now


i got this instead now, its a new error but it did get rid of the old one, i’ve never had this error before so i’ll try to fix it but i’m not 100% sure if i can

okay i did it but in a really weird way, idk if it will work forever but if it works it works

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.