Index: src/game/Guild.cpp =================================================================== --- src/game/Guild.cpp (revision 5137) +++ src/game/Guild.cpp (working copy) @@ -1096,8 +1096,10 @@ return true; } -void Guild::SetBankMoney(uint64 money) +void Guild::SetBankMoney(int64 money) { + if (money < 0) // I don't know how this happens, it does!! + money = 0; guildbank_money = money; CharacterDatabase.PExecute("UPDATE `guild` SET `BankMoney`='" I64FMTD "' WHERE `guildid`='%u'", money, Id); Index: src/game/Guild.h =================================================================== --- src/game/Guild.h (revision 5137) +++ src/game/Guild.h (working copy) @@ -289,7 +289,7 @@ void SendMoneyInfo(WorldSession *session, uint32 LowGuid); bool MemberMoneyWithdraw(uint32 amount, uint32 LowGuid); uint64 GetGuildBankMoney() { return guildbank_money; } - void SetBankMoney(uint64 money); + void SetBankMoney(int64 money); // per days bool MemberItemWithdraw(uint8 TabId, uint32 LowGuid); uint32 GetMemberSlotWithdrawRem(uint32 LowGuid, uint8 TabId); Index: src/game/GuildHandler.cpp =================================================================== --- src/game/GuildHandler.cpp (revision 5137) +++ src/game/GuildHandler.cpp (working copy) @@ -1219,6 +1219,7 @@ pGuild->StoreItem(BankTabDst, &BankTabSlotDst, pItemDst); pItemDst->FSetState(ITEM_NEW); pItemSrc->SetCount(pItemSrc->GetCount()-SplitedAmount); + pItemSrc->FSetState(ITEM_CHANGED); pItemSrc->SaveToDB(); pItemDst->SaveToDB(); CharacterDatabase.PExecute("REPLACE INTO `guild_bank_item` (`guildid`,`TabId`,`SlotId`,`item_guid`) " @@ -1232,9 +1233,6 @@ { pGuild->EmptyBankSlot(BankTab, BankTabSlot);// 'empty' moved to BankTabSlot - CharacterDatabase.PExecute("DELETE FROM `guild_bank_item` WHERE `guildid`='%u' AND `TabId`='%u' AND `SlotId`='%u'", - GuildId, uint32(BankTabDst), uint32(BankTabSlotDst)); - pGuild->StoreItem(BankTabDst, &BankTabSlotDst, pItemSrc); // pItemSrc moved to BankTabSlotDst @@ -1256,7 +1254,11 @@ if(SplitedAmount + pItemDst->GetCount() > pItemDst->GetMaxStackCount()) SplitedAmount = pItemDst->GetMaxStackCount() - pItemDst->GetCount(); } - + uint32 srcentry, dstentry, srccount, dstcount; + srcentry = pItemSrc->GetEntry(); + dstentry = pItemDst->GetEntry(); + srccount = pItemSrc->GetCount(); + dstcount = pItemDst->GetCount(); if (SplitedAmount) // Bank -> Bank split to another item (partly move) { pItemDst->SetCount(pItemDst->GetCount()+SplitedAmount); @@ -1275,10 +1277,10 @@ } else { + pItemSrc->FSetState(ITEM_CHANGED); pItemSrc->SaveToDB(); } - CharacterDatabase.PExecute("REPLACE INTO `guild_bank_item` (`guildid`,`TabId`,`SlotId`,`item_guid`) " "VALUES ('%u', '%u', '%u', '%u')", GuildId, uint32(BankTabDst), uint32(BankTabSlotDst), pItemDst->GetGUIDLow()); @@ -1288,12 +1290,14 @@ } else // Bank to Bank swap case { + pGuild->EmptyBankSlot(BankTab, BankTabSlot);// Or next will merge stacks pGuild->StoreItem(BankTab, &BankTabSlot, pItemDst); // pItemDst moved to BankTabSlot CharacterDatabase.PExecute("REPLACE INTO `guild_bank_item` (`guildid`,`TabId`,`SlotId`,`item_guid`) " "VALUES ('%u', '%u', '%u', '%u')", GuildId, uint32(BankTab), uint32(BankTabSlot), pItemDst->GetGUIDLow()); + pGuild->EmptyBankSlot(BankTabDst, BankTabSlotDst);// Or next will merge stacks pGuild->StoreItem(BankTabDst, &BankTabSlotDst, pItemSrc); // pItemSrc moved to BankTabSlotDst @@ -1342,10 +1346,10 @@ uint32 Count = pItemBank->GetCount(); uint16 Dest; uint8 msg; - msg = GetPlayer()->CanStoreItem(NULL_BAG, NULL_SLOT, Dest, pItemBank, false); + msg = pl->CanStoreItem(NULL_BAG, NULL_SLOT, Dest, pItemBank, false); if( msg == EQUIP_ERR_OK ) { - Item *pItemStacked = GetPlayer()->StoreItem(Dest, pItemBank, true); // This cause item state to change + Item *pItemStacked = pl->StoreItem(Dest, pItemBank, true); // This cause item state to change pGuild->EmptyBankSlot(BankTab, BankTabSlot);// Delete from bank table if (pItemStacked == pItemBank) // In case stacked to player, do not execute { @@ -1361,12 +1365,12 @@ } else { - GetPlayer()->SendEquipError( msg, pItemBank, NULL ); + pl->SendEquipError( msg, pItemBank, NULL ); CharacterDatabase.RollbackTransaction(); return; } pGuild->LogBankEvent(GUILD_BANK_LOG_WITHDRAW_ITEM, BankTab, pl->GetGUIDLow(), Entry, Count); - pGuild->MemberItemWithdraw(BankTab, GetPlayer()->GetGUIDLow()); + pGuild->MemberItemWithdraw(BankTab, pl->GetGUIDLow()); CharacterDatabase.CommitTransaction(); pGuild->DisplayGuildBankContent(this, BankTab); return; @@ -1443,7 +1447,6 @@ pItemBank->SetCount(pItemBank->GetCount()-SplitedAmount); pItemChar->SetState(ITEM_CHANGED); pItemChar->SaveToDB(); - pItemBank->FSetState(ITEM_CHANGED); if (pItemBank->GetCount() == 0) // We emptied the bank slot { pItemBank->RemoveFromWorld(); @@ -1451,7 +1454,10 @@ pGuild->EmptyBankSlot(BankTab, BankTabSlot); } else + { + pItemBank->FSetState(ITEM_CHANGED); pItemBank->SaveToDB(); + } } else // Bank <-> Char swap items { @@ -1469,7 +1475,7 @@ return; } - // if can store in invnetory + // if can store in inventory // check possibility store in bank // prevent unexpected merge in bank item @@ -1502,7 +1508,7 @@ else { // Char -> Bank cases pl->SaveInventoryAndGoldToDB(); - // No autostore here + // No autostore here - false there is autostore possible if (!pItemBank) { if (SplitedAmount && SplitedAmount < pItemChar->GetCount()) @@ -1528,8 +1534,14 @@ //first be sure char item is saved pItemChar->SaveToDB(); // autostore can be set or not - pGuild->StoreItem(BankTab, &BankTabSlot, pItemChar); + Item *pRetItem = pGuild->StoreItem(BankTab, &BankTabSlot, pItemChar); + if (pRetItem == pItemChar) + { + sLog.outDebug("Failed to put item in bank"); + CharacterDatabase.RollbackTransaction(); + return; + } pItemChar->RemoveFromUpdateQueueOf(pl); pItemChar->DestroyForPlayer(pl); pl->RemoveItem(PlayerBag, PlayerSlot, true); @@ -1537,6 +1549,7 @@ CharacterDatabase.PExecute("REPLACE INTO `guild_bank_item` (`guildid`,`TabId`,`SlotId`,`item_guid`) " "VALUES ('%u', '%u', '%u', '%u')", GuildId, uint32(BankTab), uint32(BankTabSlot), pItemChar->GetGUIDLow()); pItemChar->DeleteFromInventoryDB(); + pItemChar->FSetState(ITEM_CHANGED); pItemChar->SaveToDB(); // this item is now in bank } pl->SaveInventoryAndGoldToDB(); @@ -1544,6 +1557,12 @@ } else { + if (pGuild->GetMemberSlotWithdrawRem(pl->GetGUIDLow(), BankTab)==0) + { + sLog.outDebug("GUILDBANK: Player tried to swap an item with no withdraw right!!"); + CharacterDatabase.RollbackTransaction(); + return; + } if(pItemChar->GetEntry()==pItemBank->GetEntry() && pItemBank->GetCount() < pItemBank->GetMaxStackCount()) { if(SplitedAmount + pItemBank->GetCount() > pItemBank->GetMaxStackCount())