diff --git a/zone/client.cpp b/zone/client.cpp index c64ac6557..6dd8c31c5 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -2170,78 +2170,84 @@ void Client::QuestReadBook(const char* text, uint8 type) { } } -void Client::SendClientMoneyUpdate(uint8 type,uint32 amount){ - auto outapp = new EQApplicationPacket(OP_TradeMoneyUpdate, sizeof(TradeMoneyUpdate_Struct)); - TradeMoneyUpdate_Struct* mus= (TradeMoneyUpdate_Struct*)outapp->pBuffer; - mus->amount=amount; - mus->trader=0; - mus->type=type; - QueuePacket(outapp); - safe_delete(outapp); +uint32 Client::GetCarriedPlatinum() { + return ( + GetMoney(3, 0) + + (GetMoney(2, 0) / 10) + + (GetMoney(1, 0) / 100) + + (GetMoney(0, 0) / 1000) + ); } -bool Client::TakeMoneyFromPP(uint64 copper, bool updateclient) { - int64 copperpp,silver,gold,platinum; - copperpp = m_pp.copper; +bool Client::TakePlatinum(uint32 platinum, bool update_client) { + if (GetCarriedPlatinum() >= platinum) { + auto copper = static_cast(platinum * 1000); + return TakeMoneyFromPP(copper, update_client); + } + + return false; +} + +bool Client::TakeMoneyFromPP(uint64 copper, bool update_client) { + int64 player_copper, silver, gold, platinum; + player_copper = m_pp.copper; silver = static_cast(m_pp.silver) * 10; gold = static_cast(m_pp.gold) * 100; platinum = static_cast(m_pp.platinum) * 1000; - int64 clienttotal = copperpp + silver + gold + platinum; + int64 client_total = player_copper + silver + gold + platinum; - clienttotal -= copper; - if(clienttotal < 0) - { + client_total -= copper; + if (client_total < 0) { return false; // Not enough money! - } - else - { - copperpp -= copper; - if(copperpp <= 0) - { - copper = std::abs(copperpp); + } else { + player_copper -= copper; + if(player_copper <= 0) { + copper = std::abs(player_copper); m_pp.copper = 0; - } - else - { - m_pp.copper = copperpp; - if(updateclient) + } else { + m_pp.copper = player_copper; + + if (update_client) { SendMoneyUpdate(); + } + SaveCurrency(); return true; } + silver -= copper; - if(silver <= 0) - { + if (silver <= 0) { copper = std::abs(silver); m_pp.silver = 0; - } - else - { - m_pp.silver = silver/10; - m_pp.copper += (silver-(m_pp.silver*10)); - if(updateclient) + } else { + m_pp.silver = silver / 10; + m_pp.copper += (silver - (m_pp.silver * 10)); + + if (update_client) { SendMoneyUpdate(); + } + SaveCurrency(); return true; } gold -=copper; - if(gold <= 0) - { + if (gold <= 0) { copper = std::abs(gold); m_pp.gold = 0; - } - else - { - m_pp.gold = gold/100; - uint64 silvertest = (gold-(static_cast(m_pp.gold)*100))/10; - m_pp.silver += silvertest; - uint64 coppertest = (gold-(static_cast(m_pp.gold)*100+silvertest*10)); - m_pp.copper += coppertest; - if(updateclient) + } else { + m_pp.gold = gold / 100; + uint64 silver_test = (gold - (static_cast(m_pp.gold) * 100)) / 10; + m_pp.silver += silver_test; + uint64 copper_test = (gold - (static_cast(m_pp.gold) * 100 + silver_test * 10)); + m_pp.copper += copper_test; + + if (update_client) { SendMoneyUpdate(); + } + SaveCurrency(); return true; } @@ -2250,74 +2256,84 @@ bool Client::TakeMoneyFromPP(uint64 copper, bool updateclient) { //Impossible for plat to be negative, already checked above - m_pp.platinum = platinum/1000; - uint64 goldtest = (platinum-(static_cast(m_pp.platinum)*1000))/100; - m_pp.gold += goldtest; - uint64 silvertest = (platinum-(static_cast(m_pp.platinum)*1000+goldtest*100))/10; - m_pp.silver += silvertest; - uint64 coppertest = (platinum-(static_cast(m_pp.platinum)*1000+goldtest*100+silvertest*10)); - m_pp.copper = coppertest; - if(updateclient) + m_pp.platinum = platinum / 1000; + uint64 gold_test = (platinum - (static_cast(m_pp.platinum) * 1000)) / 100; + m_pp.gold += gold_test; + uint64 silver_test = (platinum - (static_cast(m_pp.platinum) * 1000 + gold_test * 100)) / 10; + m_pp.silver += silver_test; + uint64 copper_test = (platinum - (static_cast(m_pp.platinum) * 1000 + gold_test * 100 + silver_test * 10)); + m_pp.copper = copper_test; + + if (update_client) { SendMoneyUpdate(); + } + RecalcWeight(); SaveCurrency(); return true; } } -void Client::AddMoneyToPP(uint64 copper, bool updateclient){ - uint64 tmp; - uint64 tmp2; - tmp = copper; +void Client::AddPlatinum(uint32 platinum, bool update_client) { + auto copper = static_cast(platinum * 1000); + AddMoneyToPP(copper, update_client); +} + +void Client::AddMoneyToPP(uint64 copper, bool update_client){ + uint64 temporary_copper; + uint64 temporary_copper_two; + temporary_copper = copper; /* Add Amount of Platinum */ - tmp2 = tmp/1000; - int32 new_val = m_pp.platinum + tmp2; - if(new_val < 0) { m_pp.platinum = 0; } - else { m_pp.platinum = m_pp.platinum + tmp2; } - tmp-=tmp2*1000; + temporary_copper_two = temporary_copper / 1000; + int32 new_value = m_pp.platinum + temporary_copper_two; - //if (updateclient) - // SendClientMoneyUpdate(3,tmp2); + if (new_value < 0) { + m_pp.platinum = 0; + } else { + m_pp.platinum = m_pp.platinum + temporary_copper_two; + } + + temporary_copper -= temporary_copper_two * 1000; /* Add Amount of Gold */ - tmp2 = tmp/100; - new_val = m_pp.gold + tmp2; - if(new_val < 0) { m_pp.gold = 0; } - else { m_pp.gold = m_pp.gold + tmp2; } + temporary_copper_two = temporary_copper / 100; + new_value = m_pp.gold + temporary_copper_two; - tmp-=tmp2*100; - //if (updateclient) - // SendClientMoneyUpdate(2,tmp2); + if (new_value < 0) { + m_pp.gold = 0; + } else { + m_pp.gold = m_pp.gold + temporary_copper_two; + } + + temporary_copper -= temporary_copper_two * 100; /* Add Amount of Silver */ - tmp2 = tmp/10; - new_val = m_pp.silver + tmp2; - if(new_val < 0) { + temporary_copper_two = temporary_copper / 10; + new_value = m_pp.silver + temporary_copper_two; + + if (new_value < 0) { m_pp.silver = 0; } else { - m_pp.silver = m_pp.silver + tmp2; + m_pp.silver = m_pp.silver + temporary_copper_two; } - tmp-=tmp2*10; - //if (updateclient) - // SendClientMoneyUpdate(1,tmp2); - // Add Copper - //tmp = tmp - (tmp2* 10); - //if (updateclient) - // SendClientMoneyUpdate(0,tmp); - tmp2 = tmp; - new_val = m_pp.copper + tmp2; - if(new_val < 0) { + temporary_copper -= temporary_copper_two * 10; + + /* Add Amount of Copper */ + temporary_copper_two = temporary_copper; + new_value = m_pp.copper + temporary_copper_two; + + if (new_value < 0) { m_pp.copper = 0; } else { - m_pp.copper = m_pp.copper + tmp2; + m_pp.copper = m_pp.copper + temporary_copper_two; } - //send them all at once, since the above code stopped working. - if(updateclient) + if (update_client) { SendMoneyUpdate(); + } RecalcWeight(); @@ -2337,27 +2353,32 @@ void Client::EVENT_ITEM_ScriptStopReturn(){ this->SetEntityVariable("Stop_Return", buffer); } -void Client::AddMoneyToPP(uint32 copper, uint32 silver, uint32 gold, uint32 platinum, bool updateclient){ - this->EVENT_ITEM_ScriptStopReturn(); +void Client::AddMoneyToPP(uint32 copper, uint32 silver, uint32 gold, uint32 platinum, bool update_client){ + EVENT_ITEM_ScriptStopReturn(); int32 new_value = m_pp.platinum + platinum; - if(new_value >= 0 && new_value > m_pp.platinum) + if (new_value >= 0 && new_value > m_pp.platinum) { m_pp.platinum += platinum; + } new_value = m_pp.gold + gold; - if(new_value >= 0 && new_value > m_pp.gold) + if (new_value >= 0 && new_value > m_pp.gold) { m_pp.gold += gold; + } new_value = m_pp.silver + silver; - if(new_value >= 0 && new_value > m_pp.silver) + if (new_value >= 0 && new_value > m_pp.silver) { m_pp.silver += silver; + } new_value = m_pp.copper + copper; - if(new_value >= 0 && new_value > m_pp.copper) + if (new_value >= 0 && new_value > m_pp.copper) { m_pp.copper += copper; + } - if(updateclient) + if (update_client) { SendMoneyUpdate(); + } RecalcWeight(); SaveCurrency(); @@ -2380,41 +2401,55 @@ void Client::SendMoneyUpdate() { FastQueuePacket(&outapp); } -bool Client::HasMoney(uint64 Copper) { +bool Client::HasMoney(uint64 copper) { - if ((static_cast(m_pp.copper) + + if ( + (static_cast(m_pp.copper) + (static_cast(m_pp.silver) * 10) + (static_cast(m_pp.gold) * 100) + - (static_cast(m_pp.platinum) * 1000)) >= Copper) + (static_cast(m_pp.platinum) * 1000)) >= copper + ) { return true; + } return false; } uint64 Client::GetCarriedMoney() { - return ((static_cast(m_pp.copper) + - (static_cast(m_pp.silver) * 10) + - (static_cast(m_pp.gold) * 100) + - (static_cast(m_pp.platinum) * 1000))); + return ( + ( + static_cast(m_pp.copper) + + (static_cast(m_pp.silver) * 10) + + (static_cast(m_pp.gold) * 100) + + (static_cast(m_pp.platinum) * 1000) + ) + ); } uint64 Client::GetAllMoney() { return ( - (static_cast(m_pp.copper) + - (static_cast(m_pp.silver) * 10) + - (static_cast(m_pp.gold) * 100) + - (static_cast(m_pp.platinum) * 1000) + - (static_cast(m_pp.copper_bank) + - (static_cast(m_pp.silver_bank) * 10) + - (static_cast(m_pp.gold_bank) * 100) + - (static_cast(m_pp.platinum_bank) * 1000) + - (static_cast(m_pp.copper_cursor) + - (static_cast(m_pp.silver_cursor) * 10) + - (static_cast(m_pp.gold_cursor) * 100) + - (static_cast(m_pp.platinum_cursor) * 1000) + - (static_cast(m_pp.platinum_shared) * 1000))))); + ( + static_cast(m_pp.copper) + + (static_cast(m_pp.silver) * 10) + + (static_cast(m_pp.gold) * 100) + + (static_cast(m_pp.platinum) * 1000) + + ( + static_cast(m_pp.copper_bank) + + (static_cast(m_pp.silver_bank) * 10) + + (static_cast(m_pp.gold_bank) * 100) + + (static_cast(m_pp.platinum_bank) * 1000) + + ( + static_cast(m_pp.copper_cursor) + + (static_cast(m_pp.silver_cursor) * 10) + + (static_cast(m_pp.gold_cursor) * 100) + + (static_cast(m_pp.platinum_cursor) * 1000) + + (static_cast(m_pp.platinum_shared) * 1000) + ) + ) + ) + ); } bool Client::CheckIncreaseSkill(EQ::skills::SkillType skillid, Mob *against_who, int chancemodi) { @@ -8692,7 +8727,7 @@ void Client::QuestReward(Mob* target, uint32 copper, uint32 silver, uint32 gold, qr->exp_reward = exp; if (copper > 0 || silver > 0 || gold > 0 || platinum > 0) - AddMoneyToPP(copper, silver, gold, platinum, false); + AddMoneyToPP(copper, silver, gold, platinum); if (itemid > 0) SummonItem(itemid, -1, 0, 0, 0, 0, 0, false, EQ::invslot::slotCursor); @@ -8727,7 +8762,7 @@ void Client::QuestReward(Mob* target, const QuestReward_Struct &reward, bool fac qr->mob_id = target ? target->GetID() : 0; // Entity ID for the from mob name if (reward.copper > 0 || reward.silver > 0 || reward.gold > 0 || reward.platinum > 0) - AddMoneyToPP(reward.copper, reward.silver, reward.gold, reward.platinum, false); + AddMoneyToPP(reward.copper, reward.silver, reward.gold, reward.platinum); for (int i = 0; i < QUESTREWARD_COUNT; ++i) if (reward.item_id[i] > 0) diff --git a/zone/client.h b/zone/client.h index 2c8507629..c5998406c 100644 --- a/zone/client.h +++ b/zone/client.h @@ -733,13 +733,15 @@ public: void ReadBook(BookRequest_Struct *book); void ReadBookByName(std::string book_name, uint8 book_type); void QuestReadBook(const char* text, uint8 type); - void SendClientMoneyUpdate(uint8 type,uint32 amount); void SendMoneyUpdate(); - bool TakeMoneyFromPP(uint64 copper, bool updateclient=false); - void AddMoneyToPP(uint64 copper,bool updateclient); - void AddMoneyToPP(uint32 copper, uint32 silver, uint32 gold,uint32 platinum,bool updateclient); + bool TakeMoneyFromPP(uint64 copper, bool update_client = false); + bool TakePlatinum(uint32 platinum, bool update_client = false); + void AddMoneyToPP(uint64 copper, bool update_client = false); + void AddMoneyToPP(uint32 copper, uint32 silver, uint32 gold, uint32 platinum, bool update_client = false); + void AddPlatinum(uint32 platinu, bool update_client = false); bool HasMoney(uint64 copper); uint64 GetCarriedMoney(); + uint32 GetCarriedPlatinum(); uint64 GetAllMoney(); uint32 GetMoney(uint8 type, uint8 subtype); int GetAccountAge(); diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 01a60f06e..4a7cc15cf 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -3652,12 +3652,12 @@ void Client::Handle_OP_Begging(const EQApplicationPacket *app) if (CurrentSkill < 50) { brs->Result = 4; // Copper - AddMoneyToPP(brs->Amount, false); + AddMoneyToPP(brs->Amount); } else { brs->Result = 3; // Silver - AddMoneyToPP(brs->Amount * 10, false); + AddMoneyToPP(brs->Amount * 10); } } @@ -13295,7 +13295,7 @@ void Client::Handle_OP_ShopPlayerSell(const EQApplicationPacket *app) } } - AddMoneyToPP(price, false); + AddMoneyToPP(price); if (inst->IsStackable() || inst->IsCharged()) { diff --git a/zone/corpse.cpp b/zone/corpse.cpp index bfedf47d1..3289564f2 100644 --- a/zone/corpse.cpp +++ b/zone/corpse.cpp @@ -1062,7 +1062,7 @@ void Corpse::MakeLootRequestPackets(Client* client, const EQApplicationPacket* a d->silver = GetSilver(); d->gold = GetGold(); d->platinum = GetPlatinum(); - client->AddMoneyToPP(GetCopper(), GetSilver(), GetGold(), GetPlatinum(), false); + client->AddMoneyToPP(GetCopper(), GetSilver(), GetGold(), GetPlatinum()); } RemoveCash(); diff --git a/zone/lua_client.cpp b/zone/lua_client.cpp index b74a99b31..eaeb743bf 100644 --- a/zone/lua_client.cpp +++ b/zone/lua_client.cpp @@ -490,6 +490,10 @@ bool Lua_Client::TakeMoneyFromPP(uint64 copper, bool update_client) { return self->TakeMoneyFromPP(copper, update_client); } +void Lua_Client::AddMoneyToPP(uint32 copper, uint32 silver, uint32 gold, uint32 platinum) { + Lua_Safe_Call_Void(); + self->AddMoneyToPP(copper, silver, gold, platinum); +} void Lua_Client::AddMoneyToPP(uint32 copper, uint32 silver, uint32 gold, uint32 platinum, bool update_client) { Lua_Safe_Call_Void(); self->AddMoneyToPP(copper, silver, gold, platinum, update_client); @@ -2397,6 +2401,31 @@ void Lua_Client::AddItem(luabind::object item_table) { ); } +void Lua_Client::AddPlatinum(uint32 platinum) { + Lua_Safe_Call_Void(); + self->AddPlatinum(platinum); +} + +void Lua_Client::AddPlatinum(uint32 platinum, bool update_client) { + Lua_Safe_Call_Void(); + self->AddPlatinum(platinum, update_client); +} + +uint32 Lua_Client::GetCarriedPlatinum() { + Lua_Safe_Call_Int(); + return self->GetCarriedPlatinum(); +} + +bool Lua_Client::TakePlatinum(uint32 platinum) { + Lua_Safe_Call_Bool(); + return self->TakePlatinum(platinum); +} + +bool Lua_Client::TakePlatinum(uint32 platinum, bool update_client) { + Lua_Safe_Call_Bool(); + return self->TakePlatinum(platinum, update_client); +} + luabind::scope lua_register_client() { return luabind::class_("Client") .def(luabind::constructor<>()) @@ -2418,7 +2447,10 @@ luabind::scope lua_register_client() { .def("AddLevelBasedExp", (void(Lua_Client::*)(int))&Lua_Client::AddLevelBasedExp) .def("AddLevelBasedExp", (void(Lua_Client::*)(int,int))&Lua_Client::AddLevelBasedExp) .def("AddLevelBasedExp", (void(Lua_Client::*)(int,int,bool))&Lua_Client::AddLevelBasedExp) + .def("AddMoneyToPP", (void(Lua_Client::*)(uint32,uint32,uint32,uint32))&Lua_Client::AddMoneyToPP) .def("AddMoneyToPP", (void(Lua_Client::*)(uint32,uint32,uint32,uint32,bool))&Lua_Client::AddMoneyToPP) + .def("AddPlatinum", (void(Lua_Client::*)(uint32))&Lua_Client::AddPlatinum) + .def("AddPlatinum", (void(Lua_Client::*)(uint32,bool))&Lua_Client::AddPlatinum) .def("AddPVPPoints", (void(Lua_Client::*)(uint32))&Lua_Client::AddPVPPoints) .def("AddSkill", (void(Lua_Client::*)(int,int))&Lua_Client::AddSkill) .def("Admin", (int(Lua_Client::*)(void))&Lua_Client::Admin) @@ -2506,6 +2538,7 @@ luabind::scope lua_register_client() { .def("GetBindZoneID", (uint32(Lua_Client::*)(int))&Lua_Client::GetBindZoneID) .def("GetBindZoneID", (uint32(Lua_Client::*)(void))&Lua_Client::GetBindZoneID) .def("GetCarriedMoney", (uint64(Lua_Client::*)(void))&Lua_Client::GetCarriedMoney) + .def("GetCarriedPlatinum", (uint32(Lua_Client::*)(void))&Lua_Client::GetCarriedPlatinum) .def("GetCharacterFactionLevel", (int(Lua_Client::*)(int))&Lua_Client::GetCharacterFactionLevel) .def("GetClassBitmask", (int(Lua_Client::*)(void))&Lua_Client::GetClassBitmask) .def("GetClientMaxLevel", (int(Lua_Client::*)(void))&Lua_Client::GetClientMaxLevel) @@ -2769,6 +2802,8 @@ luabind::scope lua_register_client() { .def("TGB", (bool(Lua_Client::*)(void))&Lua_Client::TGB) .def("TakeMoneyFromPP", (bool(Lua_Client::*)(uint64))&Lua_Client::TakeMoneyFromPP) .def("TakeMoneyFromPP", (bool(Lua_Client::*)(uint64,bool))&Lua_Client::TakeMoneyFromPP) + .def("TakePlatinum", (bool(Lua_Client::*)(uint32))&Lua_Client::TakePlatinum) + .def("TakePlatinum", (bool(Lua_Client::*)(uint32,bool))&Lua_Client::TakePlatinum) .def("Thirsty", (bool(Lua_Client::*)(void))&Lua_Client::Thirsty) .def("TrainDisc", (void(Lua_Client::*)(int))&Lua_Client::TrainDisc) .def("TrainDiscBySpellID", (void(Lua_Client::*)(int32))&Lua_Client::TrainDiscBySpellID) diff --git a/zone/lua_client.h b/zone/lua_client.h index b7ebb06ad..f87d463c4 100644 --- a/zone/lua_client.h +++ b/zone/lua_client.h @@ -130,9 +130,14 @@ public: int GuildRank(); uint32 GuildID(); int GetFace(); + void AddMoneyToPP(uint32 copper, uint32 silver, uint32 gold, uint32 platinum); + void AddMoneyToPP(uint32 copper, uint32 silver, uint32 gold, uint32 platinum, bool update_client); + void AddPlatinum(uint32 platinum); + void AddPlatinum(uint32 platinum, bool update_client); bool TakeMoneyFromPP(uint64 copper); bool TakeMoneyFromPP(uint64 copper, bool update_client); - void AddMoneyToPP(uint32 copper, uint32 silver, uint32 gold, uint32 platinum, bool update_client); + bool TakePlatinum(uint32 platinum); + bool TakePlatinum(uint32 platinum, bool update_client); bool TGB(); int GetSkillPoints(); void SetSkillPoints(int skill); @@ -328,6 +333,7 @@ public: void UnFreeze(); int GetAggroCount(); uint64 GetCarriedMoney(); + uint32 GetCarriedPlatinum(); uint64 GetAllMoney(); uint32 GetMoney(uint8 type, uint8 subtype); void OpenLFGuildWindow(); diff --git a/zone/perl_client.cpp b/zone/perl_client.cpp index c45f46f9c..00b17b922 100644 --- a/zone/perl_client.cpp +++ b/zone/perl_client.cpp @@ -1427,18 +1427,20 @@ XS(XS_Client_TakeMoneyFromPP); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_TakeMoneyFromPP) { dXSARGS; if (items < 2 || items > 3) - Perl_croak(aTHX_ "Usage: Client::TakeMoneyFromPP(THIS, uint32 copper, bool update_client = false)"); // @categories Currency and Points + Perl_croak(aTHX_ "Usage: Client::TakeMoneyFromPP(THIS, uint32 copper, [bool update_client = false])"); // @categories Currency and Points { Client *THIS; - bool RETVAL; - bool updateclient = false; - uint32 copper = (uint32) SvUV(ST(1)); + bool has_money; + bool update_client = false; + uint32 copper = (uint32) SvUV(ST(1)); VALIDATE_THIS_IS_CLIENT; - if (items > 2) - updateclient = (bool) SvTRUE(ST(2)); - RETVAL = THIS->TakeMoneyFromPP(copper, updateclient); - ST(0) = boolSV(RETVAL); + if (items == 3) { + update_client = (bool) SvTRUE(ST(2)); + } + + has_money = THIS->TakeMoneyFromPP(copper, update_client); + ST(0) = boolSV(has_money); sv_2mortal(ST(0)); } XSRETURN(1); @@ -1447,17 +1449,22 @@ XS(XS_Client_TakeMoneyFromPP) { XS(XS_Client_AddMoneyToPP); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_AddMoneyToPP) { dXSARGS; - if (items != 6) - Perl_croak(aTHX_ "Usage: Client::AddMoneyToPP(THIS, uint32 copper, uint32 silver, uint32 gold, uint32 platinum, bool update_client)"); // @categories Currency and Points + if (items < 5 || items > 6) + Perl_croak(aTHX_ "Usage: Client::AddMoneyToPP(THIS, uint32 copper, uint32 silver, uint32 gold, uint32 platinum, [bool update_client = false])"); // @categories Currency and Points { Client *THIS; - uint32 copper = (uint32) SvUV(ST(1)); - uint32 silver = (uint32) SvUV(ST(2)); - uint32 gold = (uint32) SvUV(ST(3)); - uint32 platinum = (uint32) SvUV(ST(4)); - bool updateclient = (bool) SvTRUE(ST(5)); + uint32 copper = (uint32) SvUV(ST(1)); + uint32 silver = (uint32) SvUV(ST(2)); + uint32 gold = (uint32) SvUV(ST(3)); + uint32 platinum = (uint32) SvUV(ST(4)); + bool update_client = false; VALIDATE_THIS_IS_CLIENT; - THIS->AddMoneyToPP(copper, silver, gold, platinum, updateclient); + + if (items == 6) { + update_client = (bool) SvTRUE(ST(5)); + } + + THIS->AddMoneyToPP(copper, silver, gold, platinum, update_client); } XSRETURN_EMPTY; } @@ -6115,6 +6122,66 @@ XS(XS_Client_AddItem) { XSRETURN_EMPTY; } +XS(XS_Client_AddPlatinum); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Client_AddPlatinum) { + dXSARGS; + if (items < 2 || items > 3) + Perl_croak(aTHX_ "Usage: Client::AddPlatinum(THIS, uint32 platinum, [bool update_client = false])"); // @categories Currency and Points + { + Client *THIS; + uint32 platinum = (uint32) SvUV(ST(1)); + bool update_client = false; + VALIDATE_THIS_IS_CLIENT; + + if (items == 3) { + update_client = (bool) SvTRUE(ST(2)); + } + + THIS->AddPlatinum(platinum, update_client); + } + XSRETURN_EMPTY; +} + +XS(XS_Client_GetCarriedPlatinum); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Client_GetCarriedPlatinum) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: Client::GetCarriedPlatinum(THIS)"); // @categories Currency and Points + { + Client *THIS; + int RETVAL; + dXSTARG; + VALIDATE_THIS_IS_CLIENT; + RETVAL = THIS->GetCarriedPlatinum(); + XSprePUSH; + PUSHi((IV) RETVAL); + } + XSRETURN(1); +} + +XS(XS_Client_TakePlatinum); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Client_TakePlatinum) { + dXSARGS; + if (items < 2 || items > 3) + Perl_croak(aTHX_ "Usage: Client::TakePlatinum(THIS, uint32 platinum, [bool update_client = false])"); // @categories Currency and Points + { + Client *THIS; + uint32 platinum = (uint32) SvUV(ST(1)); + bool has_money = false; + bool update_client = false; + VALIDATE_THIS_IS_CLIENT; + + if (items == 3) { + update_client = (bool) SvTRUE(ST(2)); + } + + has_money = THIS->TakePlatinum(platinum, update_client); + ST(0) = boolSV(has_money); + sv_2mortal(ST(0)); + } + XSRETURN(1); +} + #ifdef __cplusplus extern "C" #endif @@ -6144,7 +6211,8 @@ XS(boot_Client) { newXSproto(strcpy(buf, "AddLDoNLoss"), XS_Client_AddLDoNLoss, file, "$$"); newXSproto(strcpy(buf, "AddLDoNWin"), XS_Client_AddLDoNWin, file, "$$"); newXSproto(strcpy(buf, "AddLevelBasedExp"), XS_Client_AddLevelBasedExp, file, "$$;$$"); - newXSproto(strcpy(buf, "AddMoneyToPP"), XS_Client_AddMoneyToPP, file, "$$$$$$"); + newXSproto(strcpy(buf, "AddMoneyToPP"), XS_Client_AddMoneyToPP, file, "$$$$$;$"); + newXSproto(strcpy(buf, "AddPlatinum"), XS_Client_AddPlatinum, file, "$$;$"); newXSproto(strcpy(buf, "AddPVPPoints"), XS_Client_AddPVPPoints, file, "$$"); newXSproto(strcpy(buf, "AddSkill"), XS_Client_AddSkill, file, "$$$"); newXSproto(strcpy(buf, "Admin"), XS_Client_Admin, file, "$"); @@ -6212,6 +6280,7 @@ XS(boot_Client) { newXSproto(strcpy(buf, "GetBindZ"), XS_Client_GetBindZ, file, "$$"); newXSproto(strcpy(buf, "GetBindZoneID"), XS_Client_GetBindZoneID, file, "$$"); newXSproto(strcpy(buf, "GetCarriedMoney"), XS_Client_GetCarriedMoney, file, "$"); + newXSproto(strcpy(buf, "GetCarriedPlatinum"), XS_Client_GetCarriedPlatinum, file, "$"); newXSproto(strcpy(buf, "GetCharacterFactionLevel"), XS_Client_GetCharacterFactionLevel, file, "$$"); newXSproto(strcpy(buf, "GetClassBitmask"), XS_Client_GetClassBitmask, file, "$"); newXSproto(strcpy(buf, "GetClientMaxLevel"), XS_Client_GetClientMaxLevel, file, "$"); @@ -6427,6 +6496,7 @@ XS(boot_Client) { newXSproto(strcpy(buf, "SummonItem"), XS_Client_SummonItem, file, "$$;$$$$$$$$"); newXSproto(strcpy(buf, "TGB"), XS_Client_TGB, file, "$"); newXSproto(strcpy(buf, "TakeMoneyFromPP"), XS_Client_TakeMoneyFromPP, file, "$$;$"); + newXSproto(strcpy(buf, "TakePlatinum"), XS_Client_TakePlatinum, file, "$$;$"); newXSproto(strcpy(buf, "Thirsty"), XS_Client_Thirsty, file, "$"); newXSproto(strcpy(buf, "TrainDiscBySpellID"), XS_Client_TrainDiscBySpellID, file, "$$"); newXSproto(strcpy(buf, "UnFreeze"), XS_Client_UnFreeze, file, "$"); diff --git a/zone/trading.cpp b/zone/trading.cpp index 87ba86d68..414dfa56f 100644 --- a/zone/trading.cpp +++ b/zone/trading.cpp @@ -2800,7 +2800,7 @@ void Client::SellToBuyer(const EQApplicationPacket *app) { Buyer->TakeMoneyFromPP(Quantity * Price); - AddMoneyToPP(Quantity * Price, false); + AddMoneyToPP(Quantity * Price); if(RuleB(Bazaar, AuditTrail)) BazaarAuditTrail(GetName(), Buyer->GetName(), ItemName, Quantity, Quantity * Price, 1);