diff --git a/data-otservbr-global/scripts/actions/door/custom_door.lua b/data-otservbr-global/scripts/actions/door/custom_door.lua index 50e27feaf46..2dadeb68488 100644 --- a/data-otservbr-global/scripts/actions/door/custom_door.lua +++ b/data-otservbr-global/scripts/actions/door/custom_door.lua @@ -18,12 +18,14 @@ function customDoor.onUse(player, item, fromPosition, target, toPosition, isHotk for index, value in ipairs(CustomDoorTable) do if value.closedDoor == item.itemid then item:transform(value.openDoor) + item:getPosition():sendSingleSoundEffect(SOUND_EFFECT_TYPE_ACTION_OPEN_DOOR) return true end end for index, value in ipairs(CustomDoorTable) do if value.openDoor == item.itemid then item:transform(value.closedDoor) + item:getPosition():sendSingleSoundEffect(SOUND_EFFECT_TYPE_ACTION_CLOSE_DOOR) return true end end diff --git a/data-otservbr-global/scripts/actions/door/key_door.lua b/data-otservbr-global/scripts/actions/door/key_door.lua index 15a38a884d1..4f748b6b635 100644 --- a/data-otservbr-global/scripts/actions/door/key_door.lua +++ b/data-otservbr-global/scripts/actions/door/key_door.lua @@ -37,6 +37,7 @@ function keyDoor.onUse(player, item, fromPosition, target, toPosition, isHotkey) for index, value in ipairs(KeyDoorTable) do if value.closedDoor == item.itemid then item:transform(value.openDoor) + item:getPosition():sendSingleSoundEffect(SOUND_EFFECT_TYPE_ACTION_OPEN_DOOR) return true end end @@ -46,6 +47,7 @@ function keyDoor.onUse(player, item, fromPosition, target, toPosition, isHotkey) return false end item:transform(value.closedDoor) + item:getPosition():sendSingleSoundEffect(SOUND_EFFECT_TYPE_ACTION_CLOSE_DOOR) return true end end @@ -60,8 +62,12 @@ function keyDoor.onUse(player, item, fromPosition, target, toPosition, isHotkey) if item.actionid == target.actionid then if value.lockedDoor == target.itemid then target:transform(value.openDoor) + item:getPosition():sendSingleSoundEffect(SOUND_EFFECT_TYPE_ACTION_OPEN_DOOR) return true elseif table.contains({ value.openDoor, value.closedDoor }, target.itemid) then + if value.openDoor == item.itemid then + item:getPosition():sendSingleSoundEffect(SOUND_EFFECT_TYPE_ACTION_CLOSE_DOOR) + end target:transform(value.lockedDoor) return true end diff --git a/data-otservbr-global/scripts/actions/door/level_door.lua b/data-otservbr-global/scripts/actions/door/level_door.lua index 177c0894c4b..6c90fca6df9 100644 --- a/data-otservbr-global/scripts/actions/door/level_door.lua +++ b/data-otservbr-global/scripts/actions/door/level_door.lua @@ -15,6 +15,7 @@ function levelDoor.onUse(player, item, fromPosition, target, toPosition, isHotke if value.closedDoor == item.itemid then if item.actionid > 0 and player:getLevel() >= item.actionid - 1000 then item:transform(value.openDoor) + item:getPosition():sendSingleSoundEffect(SOUND_EFFECT_TYPE_ACTION_OPEN_DOOR) player:teleportTo(toPosition, true) return true else diff --git a/data-otservbr-global/scripts/actions/door/quest_door.lua b/data-otservbr-global/scripts/actions/door/quest_door.lua index 438a23a5591..16dffc37919 100644 --- a/data-otservbr-global/scripts/actions/door/quest_door.lua +++ b/data-otservbr-global/scripts/actions/door/quest_door.lua @@ -15,6 +15,7 @@ function questDoor.onUse(player, item, fromPosition, target, toPosition, isHotke if value.closedDoor == item.itemid then if item.actionid > 0 and player:getStorageValue(item.actionid) ~= -1 then item:transform(value.openDoor) + item:getPosition():sendSingleSoundEffect(SOUND_EFFECT_TYPE_ACTION_OPEN_DOOR) player:teleportTo(toPosition, true) return true else diff --git a/data-otservbr-global/scripts/movements/others/closing_door.lua b/data-otservbr-global/scripts/movements/others/closing_door.lua index 750d6defc9b..a4e286d0a71 100644 --- a/data-otservbr-global/scripts/movements/others/closing_door.lua +++ b/data-otservbr-global/scripts/movements/others/closing_door.lua @@ -103,11 +103,13 @@ function closingDoor.onStepOut(creature, item, position, fromPosition) for index, value in ipairs(LevelDoorTable) do if value.openDoor == item.itemid then item:transform(value.closedDoor) + item:getPosition():sendSingleSoundEffect(SOUND_EFFECT_TYPE_ACTION_CLOSE_DOOR) end end for index, value in ipairs(QuestDoorTable) do if value.openDoor == item.itemid then item:transform(value.closedDoor) + item:getPosition():sendSingleSoundEffect(SOUND_EFFECT_TYPE_ACTION_CLOSE_DOOR) end end return true diff --git a/data-otservbr-global/scripts/quests/primal_ordeal_quest/magma_bubble_fight.lua b/data-otservbr-global/scripts/quests/primal_ordeal_quest/magma_bubble_fight.lua index 7f05611cbc0..c2642008a09 100644 --- a/data-otservbr-global/scripts/quests/primal_ordeal_quest/magma_bubble_fight.lua +++ b/data-otservbr-global/scripts/quests/primal_ordeal_quest/magma_bubble_fight.lua @@ -35,7 +35,7 @@ local encounter = Encounter("Magma Bubble", { function encounter:onReset(position) encounter:removeMonsters() bossZone:sendTextMessage(MESSAGE_EVENT_ADVANCE, string.format("The Magma Bubble has been defeated. You have %i seconds to leave the room.", config.timeToLeftAfterKill)) - addEvent(function(zn) + self:addEvent(function(zn) zn:refresh() zn:removePlayers() end, config.timeToLeftAfterKill * 1000, bossZone) diff --git a/data/libs/encounters_lib.lua b/data/libs/encounters_lib.lua index dee7a38c0c1..6258f399580 100644 --- a/data/libs/encounters_lib.lua +++ b/data/libs/encounters_lib.lua @@ -83,26 +83,25 @@ function Encounter:resetConfig(config) self.registered = false self.global = config.global or false self.timeToSpawnMonsters = ParseDuration(config.timeToSpawnMonsters or "3s") - self.events = {} + self.events = Set() end ---@param callable function The callable function for the event ---@param delay number The delay time for the event function Encounter:addEvent(callable, delay, ...) - local index = #self.events + 1 local event = addEvent(function(callable, ...) pcall(callable, ...) - table.remove(self.events, index) + self.events:remove(event) end, ParseDuration(delay), callable, ...) - table.insert(self.events, index, event) + self.events:insert(event) end ---Cancels all the events associated with the encounter function Encounter:cancelEvents() - for _, event in ipairs(self.events) do + for event in self.events:iter() do stopEvent(event) end - self.events = {} + self.events = Set() end ---Returns the stage of the encounter by the given stage number diff --git a/data/libs/functions/set.lua b/data/libs/functions/set.lua index e3e6b6f921d..35065a7334b 100644 --- a/data/libs/functions/set.lua +++ b/data/libs/functions/set.lua @@ -52,6 +52,9 @@ function Set:insert(key) end function Set:remove(key) + if not self:contains(key) then + return + end key = self:__key(key) self.values[key] = nil end diff --git a/src/creatures/players/player.cpp b/src/creatures/players/player.cpp index 0c68ec3a659..1fe7a0b1ca2 100644 --- a/src/creatures/players/player.cpp +++ b/src/creatures/players/player.cpp @@ -3942,9 +3942,7 @@ std::map &Player::getAllItemTypeCount(std::map &Player::getAllSaleItemIdAndCount(std::map &countMap) const { for (const auto item : getAllInventoryItems(false, true)) { - if (!item->hasImbuements()) { - countMap[item->getID()] += item->getItemCount(); - } + countMap[item->getID()] += item->getItemCount(); } return countMap;