Public feed #890953

Untitled

public text v1 · immutable
Raw Edit
·published 2008-02-04 06:07 UTC
rendered paste body
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())