diff --git a/src/game/ChatCommands/PlayerCommands.cpp b/src/game/ChatCommands/PlayerCommands.cpp index df9298c0..9738ae7c 100644 --- a/src/game/ChatCommands/PlayerCommands.cpp +++ b/src/game/ChatCommands/PlayerCommands.cpp @@ -1100,8 +1100,8 @@ bool ChatHandler::HandleAddItemCommand(char* args) // Subtract if (count < 0) { - plTarget->DestroyItemCount(itemId, -count, true, false); - PSendSysMessage(LANG_REMOVEITEM, itemId, -count, GetNameLink(plTarget).c_str()); + uint32 deletedCount = plTarget->DestroyItemCount(itemId, -count, true, false, /* delete_from_bank */ true, /* delete_from_buyback*/ true); + PSendSysMessage(LANG_REMOVEITEM, itemId, -count , deletedCount, GetNameLink(plTarget).c_str()); return true; } diff --git a/src/game/Object/Player.cpp b/src/game/Object/Player.cpp index fef08095..550e594a 100644 --- a/src/game/Object/Player.cpp +++ b/src/game/Object/Player.cpp @@ -12175,12 +12175,12 @@ void Player::DestroyItem(uint8 bag, uint8 slot, bool update) } } -void Player::DestroyItemCount(uint32 item, uint32 count, bool update, bool unequip_check) +uint32 Player::DestroyItemCount(uint32 item, uint32 count, bool update, bool unequip_check, bool delete_from_bank,bool delete_from_buyback) { DEBUG_LOG("STORAGE: DestroyItemCount item = %u, count = %u", item, count); uint32 remcount = 0; - // in inventory + // Search in default bagpack for (int i = INVENTORY_SLOT_ITEM_START; i < INVENTORY_SLOT_ITEM_END; ++i) { if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) @@ -12195,7 +12195,7 @@ void Player::DestroyItemCount(uint32 item, uint32 count, bool update, bool unequ if (remcount >= count) { - return; + return remcount; } } else @@ -12207,12 +12207,13 @@ void Player::DestroyItemCount(uint32 item, uint32 count, bool update, bool unequ pItem->SendCreateUpdateToPlayer(this); } pItem->SetState(ITEM_CHANGED, this); - return; + return remcount; } } } } + // Search in keyring slots for (int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; ++i) { if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) @@ -12227,7 +12228,7 @@ void Player::DestroyItemCount(uint32 item, uint32 count, bool update, bool unequ if (remcount >= count) { - return; + return remcount; } } else @@ -12239,13 +12240,13 @@ void Player::DestroyItemCount(uint32 item, uint32 count, bool update, bool unequ pItem->SendCreateUpdateToPlayer(this); } pItem->SetState(ITEM_CHANGED, this); - return; + return remcount; } } } } - // in inventory bags + // Search in inventory bags for (int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; ++i) { if (Bag* pBag = (Bag*)GetItemByPos(INVENTORY_SLOT_BAG_0, i)) @@ -12264,7 +12265,7 @@ void Player::DestroyItemCount(uint32 item, uint32 count, bool update, bool unequ if (remcount >= count) { - return; + return remcount; } } else @@ -12276,7 +12277,7 @@ void Player::DestroyItemCount(uint32 item, uint32 count, bool update, bool unequ pItem->SendCreateUpdateToPlayer(this); } pItem->SetState(ITEM_CHANGED, this); - return; + return remcount; } } } @@ -12284,8 +12285,8 @@ void Player::DestroyItemCount(uint32 item, uint32 count, bool update, bool unequ } } - // in equipment and bag list - for (int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_BAG_END; ++i) + // Search in Equiped items + for (int i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i) { if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) { @@ -12297,10 +12298,9 @@ void Player::DestroyItemCount(uint32 item, uint32 count, bool update, bool unequ { remcount += pItem->GetCount(); DestroyItem(INVENTORY_SLOT_BAG_0, i, update); - if (remcount >= count) { - return; + return remcount; } } } @@ -12313,11 +12313,125 @@ void Player::DestroyItemCount(uint32 item, uint32 count, bool update, bool unequ pItem->SendCreateUpdateToPlayer(this); } pItem->SetState(ITEM_CHANGED, this); - return; + return remcount; } } } } + + // Search in bank items + if (delete_from_bank) + { + // Normal bank slots + for (int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_ITEM_END; ++i) + { + if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) + { + if (pItem->GetEntry() == item && !pItem->IsInTrade()) + { + if (pItem->GetCount() + remcount <= count) + { + // all items in inventory can unequipped + remcount += pItem->GetCount(); + DestroyItem(INVENTORY_SLOT_BAG_0, i, update); + + if (remcount >= count) + { + return remcount; + } + } + else + { + ItemRemovedQuestCheck(pItem->GetEntry(), count - remcount); + pItem->SetCount(pItem->GetCount() - count + remcount); + if (IsInWorld() && update) + { + pItem->SendCreateUpdateToPlayer(this); + } + pItem->SetState(ITEM_CHANGED, this); + return remcount; + } + } + } + } + + // Bank bagslots + for (int i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i) + { + if (Bag* pBag = (Bag*)GetItemByPos(INVENTORY_SLOT_BAG_0, i)) + { + for (uint32 j = 0; j < pBag->GetBagSize(); ++j) + { + if (Item* pItem = pBag->GetItemByPos(j)) + { + if (pItem->GetEntry() == item && !pItem->IsInTrade()) + { + // all items in bags can be unequipped + if (pItem->GetCount() + remcount <= count) + { + remcount += pItem->GetCount(); + DestroyItem(i, j, update); + + if (remcount >= count) + { + return remcount; + } + } + else + { + ItemRemovedQuestCheck(pItem->GetEntry(), count - remcount); + pItem->SetCount(pItem->GetCount() - count + remcount); + if (IsInWorld() && update) + { + pItem->SendCreateUpdateToPlayer(this); + } + pItem->SetState(ITEM_CHANGED, this); + return remcount; + } + } + } + } + } + } + } + + // Search in buyback npcs vendor tab + if (delete_from_buyback) + { + for (int i = BUYBACK_SLOT_START; i < BUYBACK_SLOT_END; ++i) + { + if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) + { + if (pItem->GetEntry() == item && !pItem->IsInTrade()) + { + if (pItem->GetCount() + remcount <= count) + { + // all keys can be unequipped + remcount += pItem->GetCount(); + DestroyItem(INVENTORY_SLOT_BAG_0, i, update); + + if (remcount >= count) + { + return remcount; + } + } + else + { + ItemRemovedQuestCheck(pItem->GetEntry(), count - remcount); + pItem->SetCount(pItem->GetCount() - count + remcount); + if (IsInWorld() && update) + { + pItem->SendCreateUpdateToPlayer(this); + } + pItem->SetState(ITEM_CHANGED, this); + return remcount; + } + } + } + } + } + + return remcount; } void Player::DestroyZoneLimitedItem(bool update, uint32 new_zone) diff --git a/src/game/Object/Player.h b/src/game/Object/Player.h index 32e445c1..767a8fd5 100644 --- a/src/game/Object/Player.h +++ b/src/game/Object/Player.h @@ -1255,7 +1255,7 @@ class Player : public Unit // in trade, guild bank, mail.... void RemoveItemDependentAurasAndCasts(Item* pItem); void DestroyItem(uint8 bag, uint8 slot, bool update); - void DestroyItemCount(uint32 item, uint32 count, bool update, bool unequip_check = false); + uint32 DestroyItemCount(uint32 item, uint32 count, bool update, bool unequip_check = false, bool delete_from_bank = false, bool delete_from_buyback = false); void DestroyItemCount(Item* item, uint32& count, bool update); void DestroyConjuredItems(bool update); void DestroyZoneLimitedItem(bool update, uint32 new_zone); diff --git a/src/game/Tools/Language.h b/src/game/Tools/Language.h index 3f696438..b3461430 100644 --- a/src/game/Tools/Language.h +++ b/src/game/Tools/Language.h @@ -443,7 +443,7 @@ enum MangosStrings LANG_REMOVE_COOLDOWN = 493, /* Spell %u cooldown removed for %s. */ LANG_ADDITEM = 494, /* Command : Additem, itemId = %i, amount = %i */ LANG_ADDITEMSET = 495, /* Command : Additemset, itemsetId = %i */ - LANG_REMOVEITEM = 496, /* Removed itemID = %i, amount = %i from %s */ + LANG_REMOVEITEM = 496, /* Removed itemID = |cffffffff%i|r : Try to remove count = |cff00a1ff%i|r, Effective deleted count = |cffff0000%i|r from |cffffffff%s|r */ LANG_ITEM_CANNOT_CREATE = 497, /* Cannot create item '%i' (amount: %i) */ LANG_INSERT_GUILD_NAME = 498, /* You need to provide a guild name! */ LANG_PLAYER_NOT_FOUND = 499, /* Player not found! */ @@ -869,8 +869,8 @@ Faction Template: %u. */ LANG_COMMAND_AURAGROUP_ALL_AURA_REMOVED = 1704, /* All auras have been removed from %s. */ LANG_COMMAND_AURAGROUP_AURA_REMOVED_FOR_SPELL = 1705, /* Aura from spell %u has been removedfrom %s */ LANG_COMMAND_EXECUTE_GOCRE_ANOTHER_TIME = 1706, /* You will have to execute your command another time to get to the real moving npc position (.go creature %u) */ - LANG_COMMAND_FREEZE_PLAYER = 1707, /* %s has been freezed ! Be careful : Effect will persist after logout or ban if not manually removed ! (use ".unfreezeplayer" command to allow the player to move again) */ - LANG_COMMAND_UNFREEZE_PLAYER = 1708, /* %s has been unfreezed. */ + LANG_COMMAND_FREEZE_PLAYER = 1707, /* %s has been frozen ! Be careful : Effect will persist after logout or ban if not manually removed ! (use ".unfreezeplayer" command to allow the player to move again) */ + LANG_COMMAND_UNFREEZE_PLAYER = 1708, /* %s has been unfrozen. */ LANG_COMMAND_FREEZE_PLAYER_CANNOT_FREEZE_HIGHER_SECLEVEL = 1709, /* You cannot freeze %s since his security level is higher than yours. */ LANG_COMMAND_FREEZE_PLAYER_CANNOT_FREEZE_YOURSELF = 1710, /* You cannot freeze yourself ! (What a strange idea by the way...) */ LANG_COMMAND_FREEZE_PLAYER_YOU_HAVE_BEEN_FROZEN = 1711, /* A GM has frozen your character. From now, you cannot move, use spells or logout. */ diff --git a/src/shared/revision.h b/src/shared/revision.h index 786c1542..d68ebf87 100644 --- a/src/shared/revision.h +++ b/src/shared/revision.h @@ -37,7 +37,7 @@ #define CHAR_DB_UPDATE_DESCRIPTION "add_character_createdDate_col" #define WORLD_DB_VERSION_NR 22 - #define WORLD_DB_STRUCTURE_NR 1 - #define WORLD_DB_CONTENT_NR 011 - #define WORLD_DB_UPDATE_DESCRIPTION "update_additem_command_syntax" + #define WORLD_DB_STRUCTURE_NR 2 + #define WORLD_DB_CONTENT_NR 001 + #define WORLD_DB_UPDATE_DESCRIPTION "Fix_Additem_LANG_REMOVEITEM" #endif // __REVISION_H__ diff --git a/src/tools/MangosStrings_LanguageHGenerator/php-cli/GenerateLanguage.h.php b/src/tools/MangosStrings_LanguageHGenerator/php-cli/GenerateLanguage.h.php index 6dc34233..f20c3a7c 100644 --- a/src/tools/MangosStrings_LanguageHGenerator/php-cli/GenerateLanguage.h.php +++ b/src/tools/MangosStrings_LanguageHGenerator/php-cli/GenerateLanguage.h.php @@ -75,7 +75,7 @@ foreach($rows as $row) { $tagLen = strlen($row["source_enum_tag"]); - $line = TAB . $row["source_enum_tag"] . spaces($maxTagLength - $tagLen + 2) . "= " .$row["entry"] ."," . spaces(4) . "/* " .$row["content_default"] ." */" . NEWLINE; + $line = spaces(4) . $row["source_enum_tag"] . spaces($maxTagLength - $tagLen + 2) . "= " .$row["entry"] ."," . spaces(4) . "/* " .$row["content_default"] ." */" . NEWLINE; $fileContent .= $line; }