A retired fishing spot leaves its Content.Fish timer running for good #242
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
When a fishing spot retires under a player, its
World.Content.Fishtimer isleft running on that player for good. The loop never fires again, the skilling
clock stays pinned at
0— permanently due — nothing animates, andTimers.has?(player.timers, World.Content.Fish)answerstrueforever.Measured
A fly fisher at Barbarian Village, polled every four seconds:
World.TickSnapshot.npc(17914)isnil:World.FishSpotshad retired thatspot and stood its replacement at another tile under a new index. The state
above then held, unchanged, for eight minutes until the sitting was
stopped.
Why it should not be possible
World.Content.Fish.pass/3's first clause isnot standing?(action) -> halt(player), andhalt/1reachesstop/1, which isPlayer.clear_timer(player, World.Content.Fish). A loop that fired even onceafter the spot went would have cleared its own timer within a tick.
So the loop is not firing. The clock sitting at
0says the same thing fromthe other side:
Contract.Skilling.due?/1isclock == 0, so hadpass/3run it would have taken the
due?branch, rolled, and either landed a fish orbeen refused — and every refusal path halts. Nothing rolled, and nothing
animated, which
resume/2would have done.The suspicion is that the timer is driven from the pending interaction and the
engine drops that interaction when the NPC is retired, leaving the timer with
nothing to run it. Not confirmed — that is the first thing to check.
Why it matters beyond fishing
skilling?on the bot snapshot is exactlyTimers.has?(player.timers, Content.Fish)and friends, so a stale timer is abody that reports working while doing nothing.
Bot.Goals.FishandBot.Goals.GatherAndBankno longer depend on the answer — both now askwhether the target is still there before believing
skilling?— but thatis a consumer working around it, not a fix. Anything else that reads
skilling?, now or later, inherits the lie.The same shape should be checked for
World.Content.ChopandWorld.Content.Mine, whose nodes go by changing id rather than by vanishingfrom an index; it is not known whether their teardown has the same hole.