From 3ae2b08c294fca7336dc0852697b68efbb2a7490 Mon Sep 17 00:00:00 2001 From: Znote Date: Sat, 5 Feb 2022 05:16:29 +0100 Subject: [PATCH] Squashed commit of the following: commit d8832869641c9b14ee898aba3c2c907052bb376c Author: Erza Date: Mon Jan 24 07:59:11 2022 +0100 Fix certain scenarios where the house protection would fail to apply --- src/actions.cpp | 14 +++++++++++--- src/container.cpp | 20 ++++++++++++++++---- src/game.cpp | 7 +++---- src/house.cpp | 6 +++--- src/house.h | 6 +++--- src/housetile.cpp | 12 +++++------- src/housetile.h | 2 +- 7 files changed, 42 insertions(+), 25 deletions(-) diff --git a/src/actions.cpp b/src/actions.cpp index 497387c932..e5d45c90d7 100644 --- a/src/actions.cpp +++ b/src/actions.cpp @@ -430,9 +430,8 @@ bool Actions::useItem(Player* player, const Position& pos, uint8_t index, Item* } if (g_config.getBoolean(ConfigManager::ONLY_INVITED_CAN_MOVE_HOUSE_ITEMS)) { - if (HouseTile* houseTile = dynamic_cast(item->getTile())) { - House* house = houseTile->getHouse(); - if (house && !house->isInvited(player)) { + if (const HouseTile* const houseTile = dynamic_cast(item->getTile())) { + if (!item->getTopParent()->getCreature() && !houseTile->getHouse()->isInvited(player)) { player->sendCancelMessage(RETURNVALUE_PLAYERISNOTINVITED); return false; } @@ -477,6 +476,15 @@ bool Actions::useItemEx(Player* player, const Position& fromPos, const Position& showUseHotkeyMessage(player, item, player->getItemTypeCount(item->getID(), subType != item->getItemCount() ? subType : -1)); } + if (g_config.getBoolean(ConfigManager::ONLY_INVITED_CAN_MOVE_HOUSE_ITEMS)) { + if (const HouseTile* const houseTile = dynamic_cast(item->getTile())) { + if (!item->getTopParent()->getCreature() && !houseTile->getHouse()->isInvited(player)) { + player->sendCancelMessage(RETURNVALUE_PLAYERISNOTINVITED); + return false; + } + } + } + if (action->executeUse(player, item, fromPos, action->getTarget(player, creature, toPos, toStackPos), toPos, isHotkey)) { return true; } diff --git a/src/container.cpp b/src/container.cpp index b3b34ecbf1..a7b91087ba 100644 --- a/src/container.cpp +++ b/src/container.cpp @@ -303,7 +303,15 @@ ReturnValue Container::queryAdd(int32_t index, const Thing& thing, uint32_t coun } } - const Cylinder* topParent = getTopParent(); + const Cylinder* const topParent = getTopParent(); + if (actor && g_config.getBoolean(ConfigManager::ONLY_INVITED_CAN_MOVE_HOUSE_ITEMS)) { + if (const HouseTile* const houseTile = dynamic_cast(topParent->getTile())) { + if (!topParent->getCreature() && !houseTile->getHouse()->isInvited(actor->getPlayer())) { + return RETURNVALUE_PLAYERISNOTINVITED; + } + } + } + if (topParent != this) { return topParent->queryAdd(INDEX_WHEREEVER, *item, count, flags | FLAG_CHILDISOWNER, actor); } @@ -381,9 +389,13 @@ ReturnValue Container::queryRemove(const Thing& thing, uint32_t count, uint32_t return RETURNVALUE_NOTMOVEABLE; } - const HouseTile* houseTile = dynamic_cast(getTopParent()); - if (houseTile) { - return houseTile->queryRemove(thing, count, flags, actor); + if (actor && g_config.getBoolean(ConfigManager::ONLY_INVITED_CAN_MOVE_HOUSE_ITEMS)) { + const Cylinder* const topParent = getTopParent(); + if (const HouseTile* const houseTile = dynamic_cast(topParent->getTile())) { + if (!topParent->getCreature() && !houseTile->getHouse()->isInvited(actor->getPlayer())) { + return RETURNVALUE_PLAYERISNOTINVITED; + } + } } return RETURNVALUE_NOERROR; diff --git a/src/game.cpp b/src/game.cpp index ceadc3e5dd..1806344fa0 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -2628,10 +2628,9 @@ void Game::playerRequestTrade(uint32_t playerId, const Position& pos, uint8_t st } if (g_config.getBoolean(ConfigManager::ONLY_INVITED_CAN_MOVE_HOUSE_ITEMS)) { - if (HouseTile* houseTile = dynamic_cast(tradeItem->getTile())) { - House* house = houseTile->getHouse(); - if (house && !house->isInvited(player)) { - player->sendCancelMessage(RETURNVALUE_NOTPOSSIBLE); + if (const HouseTile* const houseTile = dynamic_cast(tradeItem->getTile())) { + if (!tradeItem->getTopParent()->getCreature() && !houseTile->getHouse()->isInvited(player)) { + player->sendCancelMessage(RETURNVALUE_PLAYERISNOTINVITED); return; } } diff --git a/src/house.cpp b/src/house.cpp index e8b01d618f..5d279ec083 100644 --- a/src/house.cpp +++ b/src/house.cpp @@ -125,7 +125,7 @@ void House::updateDoorDescription() const } } -AccessHouseLevel_t House::getHouseAccessLevel(const Player* player) +AccessHouseLevel_t House::getHouseAccessLevel(const Player* player) const { if (!player) { return HOUSE_OWNER; @@ -277,7 +277,7 @@ bool House::getAccessList(uint32_t listId, std::string& list) const return door->getAccessList(list); } -bool House::isInvited(const Player* player) +bool House::isInvited(const Player* player) const { return getHouseAccessLevel(player) != HOUSE_NOT_INVITED; } @@ -499,7 +499,7 @@ void AccessList::addGuildRank(const std::string& name, const std::string& rankNa } } -bool AccessList::isInList(const Player* player) +bool AccessList::isInList(const Player* player) const { if (allowEveryone) { return true; diff --git a/src/house.h b/src/house.h index 1a73a02f1f..3ae8272a7f 100644 --- a/src/house.h +++ b/src/house.h @@ -39,7 +39,7 @@ class AccessList void addGuild(const std::string& name); void addGuildRank(const std::string& name, const std::string& rankName); - bool isInList(const Player* player); + bool isInList(const Player* player) const; void getList(std::string& list) const; @@ -142,9 +142,9 @@ class House void setAccessList(uint32_t listId, const std::string& textlist); bool getAccessList(uint32_t listId, std::string& list) const; - bool isInvited(const Player* player); + bool isInvited(const Player* player) const; - AccessHouseLevel_t getHouseAccessLevel(const Player* player); + AccessHouseLevel_t getHouseAccessLevel(const Player* player) const; bool kickPlayer(Player* player, Player* target); void setEntryPos(Position pos) { diff --git a/src/housetile.cpp b/src/housetile.cpp index 4c0b504a58..e9bbb24b7f 100644 --- a/src/housetile.cpp +++ b/src/housetile.cpp @@ -90,10 +90,9 @@ ReturnValue HouseTile::queryAdd(int32_t index, const Thing& thing, uint32_t coun return RETURNVALUE_ITEMCANNOTBEMOVEDTHERE; } - if (actor) { - Player* actorPlayer = actor->getPlayer(); - if (!house->isInvited(actorPlayer)) { - return RETURNVALUE_CANNOTTHROW; + if (actor && g_config.getBoolean(ConfigManager::ONLY_INVITED_CAN_MOVE_HOUSE_ITEMS)) { + if (!house->isInvited(actor->getPlayer())) { + return RETURNVALUE_PLAYERISNOTINVITED; } } } @@ -137,9 +136,8 @@ ReturnValue HouseTile::queryRemove(const Thing& thing, uint32_t count, uint32_t } if (actor && g_config.getBoolean(ConfigManager::ONLY_INVITED_CAN_MOVE_HOUSE_ITEMS)) { - Player* actorPlayer = actor->getPlayer(); - if (!house->isInvited(actorPlayer)) { - return RETURNVALUE_NOTPOSSIBLE; + if (!house->isInvited(actor->getPlayer())) { + return RETURNVALUE_PLAYERISNOTINVITED; } } return Tile::queryRemove(thing, count, flags); diff --git a/src/housetile.h b/src/housetile.h index 7220f82991..ff14d5307f 100644 --- a/src/housetile.h +++ b/src/housetile.h @@ -41,7 +41,7 @@ class HouseTile final : public DynamicTile void addThing(int32_t index, Thing* thing) override; void internalAddThing(uint32_t index, Thing* thing) override; - House* getHouse() { + House* getHouse() const { return house; }