Index: src/game/GuildHandler.cpp =================================================================== --- src/game/GuildHandler.cpp (revision 5545) +++ src/game/GuildHandler.cpp (working copy) @@ -1094,9 +1094,14 @@ if (GetPlayer()->GetMoney() < money) return; + CharacterDatabase.BeginTransaction(); + pGuild->SetBankMoney(pGuild->GetGuildBankMoney()+money); GetPlayer()->ModifyMoney(-int(money)); + GetPlayer()->SaveGoldToDB(); + CharacterDatabase.CommitTransaction(); + // logging money if(_player->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE)) { @@ -1138,11 +1143,19 @@ if (pGuild->GetRankRights(GetPlayer()->GetRank()) & GR_RIGHT_REPAIR_FROM_GUILD) return; + CharacterDatabase.BeginTransaction(); + if (!pGuild->MemberMoneyWithdraw(money, GetPlayer()->GetGUIDLow())) + { + CharacterDatabase.RollbackTransaction(); return; + } GetPlayer()->ModifyMoney(money); + GetPlayer()->SaveGoldToDB(); + CharacterDatabase.CommitTransaction(); + // Log pGuild->LogBankEvent(GUILD_BANK_LOG_WITHDRAW_MONEY, uint8(0), GetPlayer()->GetGUIDLow(), money); @@ -1267,7 +1280,6 @@ // pItemSrc moved to BankTabSlotDst pGuild->AddGBankItemToDB(GuildId, uint32(BankTabDst), uint32(BankTabSlotDst), pItemSrc->GetGUIDLow(), pItemSrc->GetEntry()); - CharacterDatabase.CommitTransaction(); // No need to save item instances, they did not change pGuild->LogBankEvent(GUILD_BANK_LOG_MOVE_ITEM, BankTab, pl->GetGUIDLow(), pItemSrc->GetEntry(), pItemSrc->GetCount(), BankTabDst); @@ -1657,6 +1669,7 @@ if(pItemChar->GetEntry()!=pItemBank->GetEntry() && SplitedAmount) { pl->SendEquipError( EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, pItemChar, pItemBank ); + CharacterDatabase.RollbackTransaction(); return; } Index: src/game/Player.h =================================================================== --- src/game/Player.h (revision 5545) +++ src/game/Player.h (working copy) @@ -1214,6 +1214,7 @@ void SaveToDB(); void SaveInventoryAndGoldToDB(); // fast save function for item/money cheating preventing + void SaveGoldToDB() { SetUInt32ValueInDB(PLAYER_FIELD_COINAGE,GetMoney(),GetGUID()); } static bool SaveValuesArrayInDB(Tokens const& data,uint64 guid); static void SetUInt32ValueInArray(Tokens& data,uint16 index, uint32 value); static void SetFloatValueInArray(Tokens& data,uint16 index, float value);