From 17d2560ffa78ddcde00aff9526ad61634c0f255d Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Tue, 26 Jan 2021 14:12:21 +0100 Subject: [PATCH] fix(Core/Creature): Implement CREATURE_FLAG_EXTRA_NO_SELL_VENDOR (#4233) --- .../pending_db_world/rev_1610068635267906600.sql | 3 +++ src/server/game/Entities/Creature/Creature.h | 4 ++-- src/server/game/Entities/Item/Item.h | 15 +++++++++------ src/server/game/Handlers/ItemHandler.cpp | 6 ++++++ 4 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1610068635267906600.sql diff --git a/data/sql/updates/pending_db_world/rev_1610068635267906600.sql b/data/sql/updates/pending_db_world/rev_1610068635267906600.sql new file mode 100644 index 000000000..ff988e895 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1610068635267906600.sql @@ -0,0 +1,3 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1610068635267906600'); + +UPDATE `creature_template` SET `flags_extra`=`flags_extra`|0x00001000 WHERE `entry` = 27914; diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 09dd8f147..2baf9cd1e 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -40,7 +40,7 @@ enum CreatureFlagsExtra : uint32 CREATURE_FLAG_EXTRA_UNUSED_10 = 0x00000200, // TODO: Implement CREATURE_FLAG_EXTRA_NO_MOVE_FLAGS_UPDATE (creature won't update movement flags) CREATURE_FLAG_EXTRA_GHOST_VISIBILITY = 0x00000400, // creature will be only visible for dead players CREATURE_FLAG_EXTRA_UNUSED_12 = 0x00000800, // TODO: Implement CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK (creature will use offhand attacks) - CREATURE_FLAG_EXTRA_UNUSED_13 = 0x00001000, // TODO: CREATURE_FLAG_EXTRA_NO_SELL_VENDOR (players can't sell items to this vendor) + CREATURE_FLAG_EXTRA_NO_SELL_VENDOR = 0x00001000, // players can't sell items to this vendor CREATURE_FLAG_EXTRA_UNUSED_14 = 0x00002000, CREATURE_FLAG_EXTRA_WORLDEVENT = 0x00004000, // custom flag for world event creatures (left room for merging) CREATURE_FLAG_EXTRA_GUARD = 0x00008000, // Creature is guard @@ -62,7 +62,7 @@ enum CreatureFlagsExtra : uint32 CREATURE_FLAG_EXTRA_UNUSED_32 = 0x80000000, // Masks - CREATURE_FLAG_EXTRA_UNUSED = (CREATURE_FLAG_EXTRA_UNUSED_10 | CREATURE_FLAG_EXTRA_UNUSED_12 | CREATURE_FLAG_EXTRA_UNUSED_13 | + CREATURE_FLAG_EXTRA_UNUSED = (CREATURE_FLAG_EXTRA_UNUSED_10 | CREATURE_FLAG_EXTRA_UNUSED_12 | CREATURE_FLAG_EXTRA_UNUSED_14 | CREATURE_FLAG_EXTRA_UNUSED_17 | CREATURE_FLAG_EXTRA_UNUSED_22 | CREATURE_FLAG_EXTRA_UNUSED_25 | CREATURE_FLAG_EXTRA_UNUSED_26 | CREATURE_FLAG_EXTRA_UNUSED_27 | CREATURE_FLAG_EXTRA_UNUSED_28 | CREATURE_FLAG_EXTRA_UNUSED_32), diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index 7dcbb5b9f..47da2e7b9 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -132,12 +132,15 @@ enum BuyResult enum SellResult { - SELL_ERR_CANT_FIND_ITEM = 1, - SELL_ERR_CANT_SELL_ITEM = 2, // merchant doesn't like that item - SELL_ERR_CANT_FIND_VENDOR = 3, // merchant doesn't like you - SELL_ERR_YOU_DONT_OWN_THAT_ITEM = 4, // you don't own that item - SELL_ERR_UNK = 5, // nothing appears... - SELL_ERR_ONLY_EMPTY_BAG = 6 // can only do with empty bags + SELL_ERR_CANT_FIND_ITEM = 1, // The item was not found. + SELL_ERR_CANT_SELL_ITEM = 2, // The merchant doesn't want that item. + SELL_ERR_CANT_FIND_VENDOR = 3, // The merchant doesn't like you. + SELL_ERR_YOU_DONT_OWN_THAT_ITEM = 4, // You don't own that item. + SELL_ERR_UNK = 5, // Nothing appears... + SELL_ERR_ONLY_EMPTY_BAG = 6, // You can only do that with empty bags. + SELL_ERR_CANT_SELL_TO_THIS_MERCHANT = 7, // You cannot sell items to this merchant. + SELL_ERR_MUST_REPAIR_ITEM_DURABILITY_TO_USE = 8, // You must repair that item's durability to use it. + SELL_INTERNAL_BAG_ERROR = 9 // Internal Bag Error }; // -1 from client enchantment slot number diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 30874d70d..2fd936f8d 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -647,6 +647,12 @@ void WorldSession::HandleSellItemOpcode(WorldPacket& recvData) return; } + if ((creature->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_SELL_VENDOR) != 0) + { + _player->SendSellError(SELL_ERR_CANT_SELL_TO_THIS_MERCHANT, creature, itemguid, 0); + return; + } + // remove fake death if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);