//Cofruben:Split money used in OP_Split. //Rewritten by Father Nitwit void Group::SplitMoney(uint32 copper, uint32 silver, uint32 gold, uint32 platinum, Client *splitter) { //avoid unneeded work if(copper == 0 && silver == 0 && gold == 0 && platinum == 0) return; uint32 i; uint8 membercount = 0; for (i = 0; i < MAX_GROUP_MEMBERS; i++) { if (members[i] != nullptr) { membercount++; } } if (membercount == 0) return; uint32 mod; //try to handle round off error a little better if(membercount > 1) { mod = platinum % membercount; if((mod) > 0) { platinum -= mod; gold += 10 * mod; } mod = gold % membercount; if((mod) > 0) { gold -= mod; silver += 10 * mod; } mod = silver % membercount; if((mod) > 0) { silver -= mod; copper += 10 * mod; } } //calculate the splits //We can still round off copper pieces, but I dont care uint32 sc; uint32 cpsplit = copper / membercount; sc = copper % membercount; uint32 spsplit = silver / membercount; uint32 gpsplit = gold / membercount; uint32 ppsplit = platinum / membercount; char buf[128]; buf[63] = '\0'; std::string msg = "You receive"; bool one = false; if(ppsplit > 0) { snprintf(buf, 63, " %u platinum", ppsplit); msg += buf; one = true; } if(gpsplit > 0) { if(one) msg += ","; snprintf(buf, 63, " %u gold", gpsplit); msg += buf; one = true; } if(spsplit > 0) { if(one) msg += ","; snprintf(buf, 63, " %u silver", spsplit); msg += buf; one = true; } if(cpsplit > 0) { if(one) msg += ","; //this message is not 100% accurate for the splitter //if they are receiving any roundoff snprintf(buf, 63, " %u copper", cpsplit); msg += buf; one = true; } msg += " as your split"; for (i = 0; i < MAX_GROUP_MEMBERS; i++) { if (members[i] != nullptr && members[i]->IsClient()) { // If Group Member is Client Client *c = members[i]->CastToClient(); //I could not get MoneyOnCorpse to work, so we use this c->AddMoneyToPP(cpsplit, spsplit, gpsplit, ppsplit, true); c->Message(2, msg.c_str()); } } }