Public feed
#890953
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())