There is something wrong somewhere. When I get the AK, and I want to buy ammos, I see Money called until I can't afford to buy them. It sounds like when it loops to give ammos, some check doesn't do the expected job to stop it. Maybe something wrong with if (player->m_rgAmmo[nAmmo] >= weapon->iMaxAmmo1()), is iMaxAmmo1 holding proper value? It should, as I see well the new value in WeaponList message and this uses ItemInfoArray to pass the value. Problem seems to be elsewhere.