Well, the answer is that Client::AddMoneyToPP() has a bug in it. It's hard to see because it's hideously formatted and a bizarre way to split the digits up, but whatever.
Code:
Index: client.cpp
===================================================================
--- client.cpp (revision 2230)
+++ client.cpp (working copy)
@@ -2154,6 +2154,7 @@
//tmp = tmp - (tmp2* 10);
//if (updateclient)
// SendClientMoneyUpdate(0,tmp);
+ tmp2 = tmp;
new_val = m_pp.copper + tmp2;
if(new_val < 0) {
m_pp.copper = 0;
The copper value was never assigned to tmp2 (nice variables names!) so it stayed whatever the silver value was.
If I were the truly ambitious sort I'd replace that entire function with something like this:
Code:
void Client::AddMoneyToPP(uint64 copper, bool updateclient) {
sint32 platinum = copper / 1000;
sint32 gold = (copper / 100) % 10;
sint32 silver = (copper / 10) % 10;
copper %= 10;
AddMoneyToPP( copper, silver, gold, platinum, updateclient );
}