ID:146817
 
OK im having big problem here(let me get to the point right away),ok it a final fantasy type of code when i go to the battle area i use run,then i fight again and use run,then fight again and use run after i do it couple times it gives me the runtime error Infinite loop suspected--switching proc to background.
If it is not an infinite loop, either do 'set background=1' or set world.loop_checks=0.
proc name: StartRandomBattle (/mob/proc/StartRandomBattle)
usr: SSJ4_Majin_Mist (/mob/Guy)
src: SSJ4_Majin_Mist (/mob/Guy)
call stack:
SSJ4_Majin_Mist (/mob/StickGuy): StartRandomBattle(null, null, null)
GrassBattle (5,17,1) (/turf/GrassBattle): Entered(SSJ4_Majin_Mist (/mob/Guy), GrassBattle (4,17,1) (/turf/GrassBattle))

This also happen if i use attack couple times.Ok and the code that might be causing that is
mob/proc/StartRandomBattle(var/mob/Mons1, var/mob/Mons2, var/mob/Mons3)
var/turf/Location
for (var/turf/BattleLocation/BatLoc in world)
var/NotAvailable = 0
for (var/atom/A in BatLoc)
if (A.density == 1)
NotAvailable = 1
if (!NotAvailable)
Location = BatLoc
if (!Location)
return
var/global/BattleCount
BattleCount ++
usr.Escape = 0
usr.XLoc = usr.x
usr.YLoc = usr.y
usr.ZLoc = usr.z
usr.BattleNumber = BattleCount
usr.Move(locate(Location.x - 1, Location.y, Location.z))
usr.client.lazy_eye = 5
usr.icon_state = "Normal"
step(usr, EAST)
usr.dir = WEST
if (Mons1)
Mons1.BattleNumber = BattleCount
Mons1.Move(locate(usr.x - 4, usr.y, usr.z))
if (Mons2)
Mons2.BattleNumber = BattleCount
Mons2.Move(locate(usr.x - 4, usr.y + 1, usr.z))
if (Mons3)
Mons3.BattleNumber = BattleCount
var/PlayerCount
var/list/TurnOrder = new()
var/list/Players = new()
for(var/mob/M in world)
if (M.BattleNumber == BattleCount)
Players += M
var/NextPlayer
var/Agi
do
for (var/A = 0;A <= length(Players);A++)
Agi = 0
for(var/mob/M in Players)
if (M.Agility > Agi)
NextPlayer = M
Agi = M.Agility
else if (M.Agility == Agi)
if (rand(0,1))
NextPlayer = M
TurnOrder += NextPlayer
Players -= NextPlayer
PlayerCount ++
while (length(Players) > 0)
do
for(var/mob/Attacker in TurnOrder)
if (Attacker.powerlevel > 0)
if (Attacker.BattleNumber == BattleCount)
if (Attacker.client && !usr.Escape)
Attacker << "It is now your turn!"
Attacker.IsMyTurn = 1
while (Attacker.IsMyTurn)
sleep(5)
else
Attacker.NPCAttack()
else
TurnOrder -= Attacker
PlayerCount -= 1
// Here we check for any dead mobs.
for(var/mob/Dead in world)
if (Dead.Escape)
PlayerCount -= 1
TurnOrder -= Dead
Dead.icon_state = null
Dead.BattleNumber = 0
Dead.Move(locate(Dead.XLoc, Dead.YLoc, Dead.ZLoc))
else if (Dead.BattleNumber == BattleCount && Dead.powerlevel < 1)
Dead.icon_state = "Dead"
TurnOrder -= Dead
PlayerCount -= 1
if (!Dead.client)
Dead.BattleNumber = -1
while (PlayerCount > 1)
for (var/mob/M in view())
if (!M.client)
del (M)
else
M.icon_state = null
M.client.lazy_eye = 0
M.Move(locate(M.XLoc, M.YLoc, M.ZLoc))
M.BattleNumber = 0
ok that should be the code if anyone cna hellp me wiht that.Thank you.
No put usr in proc. Ungh.

Lummox JR
In response to Lummox JR
As to further onto Lummox's helpful advice, since it is a mob/proc, replace the usrs with src. That should be better I think. usr is unstable, and there only a few places where it is ok to use it.
In response to Artekia
Still doesn't work same runtime error:
Infinite loop suspected--switching proc to background.
If it is not an infinite loop, either do 'set background=1' or set world.loop_checks=0.
proc name: StartRandomBattle (/mob/proc/StartRandomBattle)
usr: DaGoat787 (/mob/Guy)
src: DaGoat787 (/mob/Guy)
call stack:
DaGoat787 (/mob/Guy): StartRandomBattle(null, null, Bunny (/mob/Monster))
GrassBattle (10,18,1) (/turf/GrassBattle): Entered(DaGoat787 (/mob/Guy), GrassBattle (11,18,1) (/turf/GrassBattle))
i chnage all the usrs to src liek ya said and here is new code with all the usr chnaged
mob/proc/StartRandomBattle(var/mob/Mons1, var/mob/Mons2, var/mob/Mons3)
var/turf/Location
for (var/turf/BattleLocation/BatLoc in world)
var/NotAvailable = 0
for (var/atom/A in BatLoc)
if (A.density == 1)
NotAvailable = 1
if (!NotAvailable)
Location = BatLoc
if (!Location)
return
var/global/BattleCount
BattleCount ++
src.Escape = 0
src.XLoc = src.x
src.YLoc = src.y
src.ZLoc = src.z
src.BattleNumber = BattleCount
src.Move(locate(Location.x - 1, Location.y, Location.z))
src.client.lazy_eye = 5
src.icon_state = "Normal"
step(src, EAST)
src.dir = WEST
if (Mons1)
Mons1.BattleNumber = BattleCount
Mons1.Move(locate(src.x - 4, src.y, src.z))
if (Mons2)
Mons2.BattleNumber = BattleCount
Mons2.Move(locate(src.x - 4, src.y + 1, src.z))
if (Mons3)
Mons3.BattleNumber = BattleCount
var/PlayerCount
var/list/TurnOrder = new()
var/list/Players = new()
for(var/mob/M in world)
if (M.BattleNumber == BattleCount)
Players += M
var/NextPlayer
var/Agi
do
for (var/A = 0;A <= length(Players);A++)
Agi = 0
for(var/mob/M in Players)
if (M.Agility > Agi)
NextPlayer = M
Agi = M.Agility
else if (M.Agility == Agi)
if (rand(0,1))
NextPlayer = M
TurnOrder += NextPlayer
Players -= NextPlayer
PlayerCount ++
while (length(Players) > 0)
do
for(var/mob/Attacker in TurnOrder)
if (Attacker.powerlevel > 0)
if (Attacker.BattleNumber == BattleCount)
if (Attacker.client && !src.Escape)
Attacker << "It is now your turn!"
Attacker.IsMyTurn = 1
while (Attacker.IsMyTurn)
sleep(5)
else
Attacker.NPCAttack()
else
TurnOrder -= Attacker
PlayerCount -= 1
// Here we check for any dead mobs.
for(var/mob/Dead in world)
if (Dead.Escape)
PlayerCount -= 1
TurnOrder -= Dead
Dead.icon_state = null
Dead.BattleNumber = 0
Dead.Move(locate(Dead.XLoc, Dead.YLoc, Dead.ZLoc))
else if (Dead.BattleNumber == BattleCount && Dead.powerlevel < 1)
Dead.icon_state = "Dead"
TurnOrder -= Dead
PlayerCount -= 1
if (!Dead.client)
Dead.BattleNumber = -1
while (PlayerCount > 1)
for (var/mob/M in view())
if (!M.client)
del (M)
else
M.icon_state = null
M.client.lazy_eye = 0
M.Move(locate(M.XLoc, M.YLoc, M.ZLoc))
M.BattleNumber = 0