Ranged AI raycasting goes nil value if target suddenly disappeared by whatever reason.
I tried to make Ranged AI by my self with some online guide and wiki.. Thought I made everything correct but single error struggling me down.
Here are my codes
function checkSight(target)
local ray = Ray.new(rootpart.Position, (target.Position - rootpart.Position).Unit * AttackRange)
local part,position = workspace:FindPartOnRayWithIgnoreList(ray, {script.Parent})
if part then
if part:IsDescendantOf(target.Parent) then
return true
end
end
return false
end
function BulletTrace()
local Victim = nil
for i,v in ipairs(workspace:GetChildren()) do
local humanoid = v:FindFirstChild("Humanoid")
local torso = v:FindFirstChild("Torso") or v:FindFirstChild("HumanoidRootPart")
if humanoid and torso and v.Name ~= script.Parent.Name and v.Name ~= Ally1 and v.Name ~= Ally2 then
if (rootpart.Position - torso.Position).magnitude < sight and humanoid.Health > 0 then
Victim = torso
Victim.Parent.PrimaryPart = Victim
end
end
end
if Victim then
return Victim.Parent:GetPrimaryPartCFrame(),CFrame.new(Victim.Parent.Humanoid.WalkToPoint).lookVector
end
end
function Shoot()
local VictimPPart,AimTrack = BulletTrace()
local VictimPPart = VictimPPart.Position -- Line 150
local aim = VictimPPart+Vector3.new(math.random(-Accuracy*.008,Accuracy*.008),math.random(-Accuracy*.009,Accuracy*.009),math.random(-Accuracy*.1,Accuracy*.1))*(2+math.random())+AimTrack
local OnHit,MyPosition = workspace:FindPartOnRay(Ray.new(barrel.Position,(aim - barrel.Position).Unit * (AttackRange * 2)), me)
if VictimPPart then
...
if OnHit then -- Line 185, causing issue sometimes aswell.
local gnomed = OnHit.Parent:findFirstChildOfClass("Humanoid")
if gnomed then
gnomed:TakeDamage(damage)
end
else
print("Hit failed :",me.Name)
end
...
end
function Attack(target)
if not reload then
repeat
local forwardVector = (target.Position - rootpart.Position).Unit
local upVector = Vector3.new(0,1,0)
local rightVector = forwardVector:Cross(upVector)
wait(FireRate)
for i = 0, 1, 0.1 do
rootpart.CFrame = rootpart.CFrame:lerp(CFrame.fromMatrix(rootpart.Position, rightVector, upVector),i)
end
Shoot()
if (rootpart.Position - target.Position).magnitude < RetreatMinRange then
human.AutoRotate = false
local c = rootpart.CFrame * CFrame.new(0,0,RetreatDistance)
human:MoveTo(c.p)
end
human.AutoRotate = true
until checkSight(target) == false or target == nil or target.Parent.Humanoid.Health < 1 -- Line 233
else
reloading(true)
end
end
And the error is :
model.script:150: attempt to index nil with 'Position' Stack Begin
Stack Begin
Script 'model.script', Line 150 - function Shoot
Script 'model.script', Line 224 - function Attack
Script 'model.script', Line 106 - function pathToLocation
Script 'model.script', Line 243 - function main
Script 'model.script', Line 269
Stack End
model.script:233: attempt to index nil with 'Humanoid' Stack Begin
Stack Begin
Script 'model.script', Line 233 - function Attack
Script 'model.script', Line 106 - function pathToLocation
Script 'model.script', Line 243 - function main
Script 'model.script', Line 269
Stack End
Rarely, Line 185 'OnHit' making similar issue with Line 150 aswell. but difference is it gets nil value it self.
The error codes seems to be happen on '150' and '233' alot which seems to be relate with ray casting on BulletTrace and checkSight, but I don't know how I could fix this.
These error seems to be happen when the target suddenly died or evaded their shot with jumping down cliff or else.
Majority of bots are ok, but it happen occasionally with few of them.
doesn't these kinds of ray usually go over if there aren't any target found?
I've tried most of way I could imagine, like add some if line when it gets nil but didn't work with my tries. Now I don't get any idea how could I fix this. anyone help?
