As for... what the code is. I have no clue. I imagine the code is in the engine and I'm just a user who sees this and speculates things. Dasius is the one that does things.
I just assume based off the misc clues pointing.
That there was a line of code introduced from Version 0.0.81 to Ver 0.0.82 - That was intended to "destroy" customers refusing all but "the one" Type they came in for.
and that this code basically told them to accept all that match type requested.
But then another code tells them to "Only accept matching material and type as requested" - and that this part, is newer than the bugfix - that it was added along side them "requesting material"
and that these two codes are conflicting (because one says to only accept Copper Greatsword while the other tells them to accept every greatsword) - causing a customer to become logic-stuck as it goes
"accept all that match type requested" - OH HEY, a greatsword that's right here in front of me (closest to them) I'll just grab that
"Deny - Doesn't match Material requested" - Oh, It's not iron, Nevermind
"Accept all that match type requested" - OH HEY, a greatsword (cloest) right here in front of me
Not Iron
Greatsword
Not Iron
and it does this likely hundreds of times in a second.
To me. this is what it looks like goes on, especially since before.
they'd walk in go "I need a Greatsword" and then deny Greatsword after greatsword until the ONE greatsword they were actually asking for was given to them - even if they were all (insert material)
and now, one of the changelog "fixes" for 0.0.82
"Fixed: Customer will not refuse any weapon no matter how many there are of the same /Type/ "
This specific Line gives me all the confidence in my speculation being what is happening.
Only I'm horrible at explaining things, and this is probably overly simplified or crudely so.
like saying "does this likely hundreds of times in a second"
The code probably does that hundreds of times in a second.
The customer themselves probably only work through a small fraction of that per second. - And normally that'd be fine.
Example
- Check Timestamp 1:11:1
- check failed 1:11:1
- check 1:11:2
- check failed 1:11:2
- Check 1:11:3
- check failed 1:11:3
- check 1:11:3
- check failed 1:11:4
- Check 1:11:5
- Item Detected matching Type 1:11:5 - clearing queue, accept?
- Item Detected Matching Material and Type 1:11:6 - Accepting
- Run Animation for Accepting item 1:11:7
- Accepting item matching material and type, marked at 1:11:6 (1:11:8)
- Run price calculation/pay blacksmith
- Accepting item matching material and type, marked at 1:11:6 (1:11:8)
- Run Animation for Accepting item 1:11:7
- Item Detected Matching Material and Type 1:11:6 - Accepting
- Item Detected matching Type 1:11:5 - clearing queue, accept?
check failed 1:11:5check 1:11:6check failed 1:11:6Check 1:11:7
Really - this would probably look more like "check scheduled 1:11:6" and scheduled every "however long it takes to scan detection area"
But then you get that logic loop
- Check 1:12:1
- Item Detected matching type 1:12:1 clearing queue, Accept?
- Deny
- (potential) Reject denial "accept any no matter how many there are of same type (Potentially just endlessly loops here.)
- Item Detected matching type 1:12:1 clearing queue, Accept?
- Check !:12:1
- Item detected 1:12:1
- Deny
- Item detected 1:12:1
- Check 1:12:1
- Check failed - Item previously detected no longer exists, removing redundant obsolete instances of item detected at 1:12:1
- Check 1:12:2
- Item Detected Matching type 1:12:2 Clearing queue, accept?
- Item detected matching Material and Type 1:12:3- Accepting
- Run Animation for accepting item 1:12:4
- Accepting Item match, marked at 1:12:3 (1:12:5)
- calculating payment
- Accepting Item match, marked at 1:12:3 (1:12:5)
- Run Animation for accepting item 1:12:4
- Item detected matching Material and Type 1:12:3- Accepting
- Item Detected Matching type 1:12:2 Clearing queue, accept?
Check 1:12:1Item detected 1:12:1Deny
Check !:12:1Item detected 1:12:1Deny
It runs through it much faster because it can quickly and easily see the "wrong item" as opposed to scanning the entire view area only to come up empty handed - and do it again.
I dunno. That could still be horribly simplified or technically incorrect because of my lack of expertise/knowledge in the area But it's how I imagine it's happening.
If its way 2 - it's able to run code faster than the game/npc can process it. - causing them to constantly restart the process, but still stay locked onto the item because it's processing code that was ran seconds ago, and will still be processing that code for seconds more.
if not, Then it has to be way 1, and it's becoming fixated and locked onto the item purely because the code is telling it "No, you can't "not" accept the item, you have to accept it' and the other code is refusing to budge. - never relinquishing the search for a new item (essentiallly... recreating the "does not accept" bug from prior.)