From 21b4cfa907ce38d71e3e681726ea05360f02e3c8 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 21 Feb 2024 15:36:54 -0300 Subject: [PATCH] refactor: move potions to core and improvement for npc sandra (#2292) --- data-canary/scripts/actions/other/potions.lua | 216 ------------ data-otservbr-global/npc/sandra.lua | 12 +- .../scripts/actions/other/potions.lua | 322 ------------------ data/global.lua | 5 - data/scripts/actions/items/potions.lua | 140 ++++++++ 5 files changed, 143 insertions(+), 552 deletions(-) delete mode 100644 data-canary/scripts/actions/other/potions.lua delete mode 100644 data-otservbr-global/scripts/actions/other/potions.lua create mode 100644 data/scripts/actions/items/potions.lua diff --git a/data-canary/scripts/actions/other/potions.lua b/data-canary/scripts/actions/other/potions.lua deleted file mode 100644 index ced11a35518..00000000000 --- a/data-canary/scripts/actions/other/potions.lua +++ /dev/null @@ -1,216 +0,0 @@ -local berserk = Condition(CONDITION_ATTRIBUTES) -berserk:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) -berserk:setParameter(CONDITION_PARAM_SUBID, AttrSubId_JeanPierreMelee) -berserk:setParameter(CONDITION_PARAM_SKILL_MELEE, 5) -berserk:setParameter(CONDITION_PARAM_SKILL_SHIELD, -10) -berserk:setParameter(CONDITION_PARAM_BUFF_SPELL, true) - -local mastermind = Condition(CONDITION_ATTRIBUTES) -mastermind:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) -mastermind:setParameter(CONDITION_PARAM_SUBID, AttrSubId_JeanPierreMagic) -mastermind:setParameter(CONDITION_PARAM_STAT_MAGICPOINTS, 3) -mastermind:setParameter(CONDITION_PARAM_BUFF_SPELL, true) - -local bullseye = Condition(CONDITION_ATTRIBUTES) -bullseye:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) -bullseye:setParameter(CONDITION_PARAM_SUBID, AttrSubId_JeanPierreDistance) -bullseye:setParameter(CONDITION_PARAM_SKILL_DISTANCE, 5) -bullseye:setParameter(CONDITION_PARAM_SKILL_SHIELD, -10) -bullseye:setParameter(CONDITION_PARAM_BUFF_SPELL, true) - -local setting = { - [236] = { - health = { 250, 350 }, - vocations = { - VOCATION.BASE_ID.KNIGHT, - VOCATION.BASE_ID.PALADIN, - }, - level = 50, - flask = 283, - description = "Only knights and paladins of level 50 or above may drink this fluid.", - }, - [237] = { - mana = { 115, 185 }, - vocations = { - VOCATION.BASE_ID.SORCERER, - VOCATION.BASE_ID.DRUID, - VOCATION.BASE_ID.PALADIN, - }, - level = 50, - flask = 283, - description = "Only sorcerers, druids and paladins of level 50 or above may drink this fluid.", - }, - [238] = { - mana = { 150, 250 }, - vocations = { - VOCATION.BASE_ID.SORCERER, - VOCATION.BASE_ID.DRUID, - }, - level = 80, - flask = 284, - description = "Only druids and sorcerers of level 80 or above may drink this fluid.", - }, - [239] = { - health = { 425, 575 }, - vocations = { - VOCATION.BASE_ID.KNIGHT, - }, - level = 80, - flask = 284, - description = "Only knights of level 80 or above may drink this fluid.", - }, - [266] = { - health = { 125, 175 }, - flask = 285, - }, - [268] = { - mana = { 75, 125 }, - flask = 285, - }, - [6558] = { - transform = { - id = { 236, 237 }, - }, - effect = CONST_ME_DRAWBLOOD, - }, - [7439] = { - condition = berserk, - vocations = { - VOCATION.BASE_ID.KNIGHT, - }, - effect = CONST_ME_MAGIC_RED, - description = "Only knights may drink this potion.", - text = "You feel stronger.", - }, - [7440] = { - condition = mastermind, - vocations = { - VOCATION.BASE_ID.SORCERER, - VOCATION.BASE_ID.DRUID, - }, - effect = CONST_ME_MAGIC_BLUE, - description = "Only sorcerers and druids may drink this potion.", - text = "You feel smarter.", - }, - [7443] = { - condition = bullseye, - vocations = { - VOCATION.BASE_ID.PALADIN, - }, - effect = CONST_ME_MAGIC_GREEN, - description = "Only paladins may drink this potion.", - text = "You feel more accurate.", - }, - [7642] = { - health = { 250, 350 }, - mana = { 100, 200 }, - vocations = { - VOCATION.BASE_ID.PALADIN, - }, - level = 80, - flask = 284, - description = "Only paladins of level 80 or above may drink this fluid.", - }, - [7643] = { - health = { 650, 850 }, - vocations = { - VOCATION.BASE_ID.KNIGHT, - }, - level = 130, - flask = 284, - description = "Only knights of level 130 or above may drink this fluid.", - }, - [7644] = { - antidote = true, - flask = 285, - }, - [7876] = { - health = { 60, 90 }, - flask = 285, - }, - [23373] = { - mana = { 425, 575 }, - vocations = { - VOCATION.BASE_ID.SORCERER, - VOCATION.BASE_ID.DRUID, - }, - level = 130, - flask = 284, - description = "Only druids and sorcerers of level 130 or above may drink this fluid.", - }, - [23374] = { - health = { 420, 580 }, - mana = { 250, 350 }, - vocations = { - VOCATION.BASE_ID.PALADIN, - }, - level = 130, - flask = 284, - description = "Only paladins of level 130 or above may drink this fluid.", - }, - [23375] = { - health = { 875, 1125 }, - vocations = { - VOCATION.BASE_ID.KNIGHT, - }, - level = 200, - flask = 284, - description = "Only knights of level 200 or above may drink this fluid.", - }, -} - -local potions = Action() - -function potions.onUse(player, item, fromPosition, target, toPosition, isHotkey) - if not target or type(target) == "userdata" and not target:isPlayer() then - return false - end - - local potion = setting[item:getId()] - if potion.level and player:getLevel() < potion.level or potion.vocations and not table.contains(potion.vocations, player:getVocation():getBaseId()) then - player:say(potion.description, TALKTYPE_MONSTER_SAY) - return true - end - - if potion.condition then - player:addCondition(potion.condition) - player:say(potion.text, TALKTYPE_MONSTER_SAY) - player:getPosition():sendMagicEffect(potion.effect) - elseif potion.transform then - item:transform(potion.transform[math.random(#potion.transform)]) - item:getPosition():sendMagicEffect(potion.effect) - return true - else - if potion.health then - doTargetCombatHealth(player, target, COMBAT_HEALING, potion.health[1], potion.health[2]) - end - - if potion.mana then - doTargetCombatMana(0, target, potion.mana[1], potion.mana[2]) - end - - if potion.antidote then - target:removeCondition(CONDITION_POISON) - end - - player:addItem(potion.flask) - target:say("Aaaah...", TALKTYPE_MONSTER_SAY) - target:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) - end - - player:getPosition():sendSingleSoundEffect(SOUND_EFFECT_TYPE_ITEM_USE_POTION, player:isInGhostMode() and nil or player) - - if not configManager.getBoolean(configKeys.REMOVE_POTION_CHARGES) then - return true - end - - player:updateSupplyTracker(item) - item:remove(1) - return true -end - -for index, value in pairs(setting) do - potions:id(index) -end - -potions:register() diff --git a/data-otservbr-global/npc/sandra.lua b/data-otservbr-global/npc/sandra.lua index 71d1eeb4774..0641b3a682e 100644 --- a/data-otservbr-global/npc/sandra.lua +++ b/data-otservbr-global/npc/sandra.lua @@ -67,7 +67,7 @@ local function creatureSayCallback(npc, creature, type, message) if table.contains({ "vial", "ticket", "bonus", "deposit" }, message) then if player:getStorageValue(Storage.OutfitQuest.MageSummoner.AddonBelt) < 1 then - npcHandler:say("You have " .. player:getStorageValue(38412) .. " credits. We have a special offer right now for depositing vials. Are you interested in hearing it?", npc, creature) + npcHandler:say("We have a special offer right now for depositing vials. Are you interested in hearing it?", npc, creature) npcHandler:setTopic(playerId, 1) elseif player:getStorageValue(Storage.OutfitQuest.MageSummoner.AddonBelt) >= 1 then npcHandler:say("Would you like to get a lottery ticket instead of the deposit for your vials?", npc, creature) @@ -119,14 +119,8 @@ local function creatureSayCallback(npc, creature, type, message) player:setStorageValue(Storage.OutfitQuest.DefaultStart, 1) --this for default start of Outfit and Addon Quests npcHandler:setTopic(playerId, 0) elseif npcHandler:getTopic(playerId) == 3 then - if player:getStorageValue(38412) >= 100 or player:removeItem(283, 100) or player:removeItem(284, 100) or player:removeItem(285, 100) then - npcHandler:say( - "Alright, thank you very much! Here is your lottery ticket, good luck. \ - Would you like to deposit more vials that way?", - npc, - creature - ) - player:setStorageValue(38412, player:getStorageValue(38412) - 100) + if player:removeItem(283, 100) or player:removeItem(284, 100) or player:removeItem(285, 100) then + npcHandler:say("Alright, thank you very much! Here is your lottery ticket, good luck. Would you like to deposit more vials that way?", npc, creature) player:addItem(5957, 1) npcHandler:setTopic(playerId, 0) else diff --git a/data-otservbr-global/scripts/actions/other/potions.lua b/data-otservbr-global/scripts/actions/other/potions.lua deleted file mode 100644 index 921eb551aeb..00000000000 --- a/data-otservbr-global/scripts/actions/other/potions.lua +++ /dev/null @@ -1,322 +0,0 @@ -local berserk = Condition(CONDITION_ATTRIBUTES) -berserk:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) -berserk:setParameter(CONDITION_PARAM_SUBID, AttrSubId_JeanPierreMelee) -berserk:setParameter(CONDITION_PARAM_SKILL_MELEE, 5) -berserk:setParameter(CONDITION_PARAM_SKILL_SHIELD, -10) -berserk:setParameter(CONDITION_PARAM_BUFF_SPELL, true) - -local mastermind = Condition(CONDITION_ATTRIBUTES) -mastermind:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) -mastermind:setParameter(CONDITION_PARAM_SUBID, AttrSubId_JeanPierreMagic) -mastermind:setParameter(CONDITION_PARAM_STAT_MAGICPOINTS, 3) -mastermind:setParameter(CONDITION_PARAM_BUFF_SPELL, true) - -local bullseye = Condition(CONDITION_ATTRIBUTES) -bullseye:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) -bullseye:setParameter(CONDITION_PARAM_SUBID, AttrSubId_JeanPierreDistance) -bullseye:setParameter(CONDITION_PARAM_SKILL_DISTANCE, 5) -bullseye:setParameter(CONDITION_PARAM_SKILL_SHIELD, -10) -bullseye:setParameter(CONDITION_PARAM_BUFF_SPELL, true) - -local antidote = Combat() -antidote:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING) -antidote:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -antidote:setParameter(COMBAT_PARAM_DISPEL, CONDITION_POISON) -antidote:setParameter(COMBAT_PARAM_AGGRESSIVE, false) -antidote:setParameter(COMBAT_PARAM_TARGETCASTERORTOPMOST, true) - -local exhaust = Condition(CONDITION_EXHAUST_HEAL) -exhaust:setParameter(CONDITION_PARAM_TICKS, (configManager.getNumber(configKeys.EX_ACTIONS_DELAY_INTERVAL) - 1000)) --- 1000 - 100 due to exact condition timing. -100 doesn't hurt us, and players don't have reminding ~50ms exhaustion. - -local function magicshield(player) - local condition = Condition(CONDITION_MANASHIELD) - condition:setParameter(CONDITION_PARAM_TICKS, 60000) - condition:setParameter(CONDITION_PARAM_MANASHIELD, math.min(player:getMaxMana(), 300 + 7.6 * player:getLevel() + 7 * player:getMagicLevel())) - player:addCondition(condition) -end - -local potions = { - [6558] = { - transform = { - id = { 236, 237 }, - }, - effect = CONST_ME_DRAWBLOOD, - }, - [7439] = { - vocations = { - VOCATION.BASE_ID.KNIGHT, - }, - condition = berserk, - effect = CONST_ME_MAGIC_RED, - description = "Only knights may drink this potion.", - text = "You feel stronger.", - }, - [7440] = { - vocations = { - VOCATION.BASE_ID.SORCERER, - VOCATION.BASE_ID.DRUID, - }, - condition = mastermind, - effect = CONST_ME_MAGIC_BLUE, - description = "Only sorcerers and druids may drink this potion.", - text = "You feel smarter.", - }, - [7443] = { - vocations = { - VOCATION.BASE_ID.PALADIN, - }, - condition = bullseye, - effect = CONST_ME_MAGIC_GREEN, - description = "Only paladins may drink this potion.", - text = "You feel more accurate.", - }, - [35563] = { - vocations = { - VOCATION.BASE_ID.SORCERER, - VOCATION.BASE_ID.DRUID, - }, - level = 14, - func = magicshield, - effect = CONST_ME_ENERGYAREA, - description = "Only sorcerers and druids of level 14 or above may drink this potion.", - }, - [236] = { - health = { - 250, - 350, - }, - vocations = { - VOCATION.BASE_ID.PALADIN, - VOCATION.BASE_ID.KNIGHT, - }, - level = 50, - flask = 283, - description = "Only knights and paladins of level 50 or above may drink this fluid.", - }, - [237] = { - mana = { - 115, - 185, - }, - level = 50, - flask = 283, - description = "Only players of level 50 or above may drink this fluid.", - }, - [238] = { - mana = { - 150, - 250, - }, - vocations = { - VOCATION.BASE_ID.SORCERER, - VOCATION.BASE_ID.DRUID, - VOCATION.BASE_ID.PALADIN, - }, - level = 80, - flask = 284, - description = "Only sorcerers, druids and paladins of level 80 or above may drink this fluid.", - }, - [239] = { - health = { - 425, - 575, - }, - vocations = { - VOCATION.BASE_ID.KNIGHT, - }, - level = 80, - flask = 284, - description = "Only knights of level 80 or above may drink this fluid.", - }, - [266] = { - health = { - 125, - 175, - }, - flask = 285, - }, - [268] = { - mana = { - 75, - 125, - }, - flask = 285, - }, - [7642] = { - health = { - 250, - 350, - }, - mana = { - 100, - 200, - }, - vocations = { - VOCATION.BASE_ID.PALADIN, - }, - level = 80, - flask = 284, - description = "Only paladins of level 80 or above may drink this fluid.", - }, - [7643] = { - health = { 650, 850 }, - vocations = { - VOCATION.BASE_ID.KNIGHT, - }, - level = 130, - flask = 284, - description = "Only knights of level 130 or above may drink this fluid.", - }, - [7644] = { - combat = antidote, - flask = 285, - }, - [7876] = { - health = { - 60, - 90, - }, - flask = 285, - }, - [23373] = { - mana = { - 425, - 575, - }, - vocations = { - VOCATION.BASE_ID.SORCERER, - VOCATION.BASE_ID.DRUID, - }, - level = 130, - flask = 284, - description = "Only druids and sorcerers of level 130 or above may drink this fluid.", - }, - [23374] = { - health = { - 420, - 580, - }, - mana = { - 250, - 350, - }, - vocations = { - VOCATION.BASE_ID.PALADIN, - }, - level = 130, - flask = 284, - description = "Only paladins of level 130 or above may drink this fluid.", - }, - [23375] = { - health = { - 875, - 1125, - }, - vocations = { - VOCATION.BASE_ID.KNIGHT, - }, - level = 200, - flask = 284, - description = "Only knights of level 200 or above may drink this fluid.", - }, -} - -local flaskPotion = Action() - -function flaskPotion.onUse(player, item, fromPosition, target, toPosition, isHotkey) - if not target or type(target) == "userdata" and not target:isPlayer() then - return false - end - - -- Delay potion - if not _G.PlayerDelayPotion[player:getId()] then - _G.PlayerDelayPotion[player:getId()] = 0 - end - if _G.PlayerDelayPotion[player:getId()] > systemTime() then - player:sendTextMessage(MESSAGE_FAILURE, Game.getReturnMessage(RETURNVALUE_YOUAREEXHAUSTED)) - return true - end - - local potion = potions[item:getId()] - if potion.level and player:getLevel() < potion.level or potion.vocations and not table.contains(potion.vocations, player:getVocation():getBaseId()) and not (player:getGroup():getId() >= GROUP_TYPE_GAMEMASTER) then - player:say(potion.description, MESSAGE_POTION) - return true - end - - if player:getCondition(CONDITION_EXHAUST_HEAL) then - player:sendTextMessage(MESSAGE_FAILURE, Game.getReturnMessage(RETURNVALUE_YOUAREEXHAUSTED)) - return true - end - - if potion.health or potion.mana or potion.combat then - if potion.health then - doTargetCombatHealth(player, target, COMBAT_HEALING, potion.health[1], potion.health[2], CONST_ME_MAGIC_BLUE) - end - - if potion.mana then - doTargetCombatMana(0, target, potion.mana[1], potion.mana[2], CONST_ME_MAGIC_BLUE) - end - - if potion.combat then - potion.combat:execute(target, Variant(target:getId())) - end - - if not potion.effect and target:getPosition() ~= nil then - target:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) - end - - player:addAchievementProgress("Potion Addict", 100000) - target:say("Aaaah...", MESSAGE_POTION) - local deactivatedFlasks = player:kv():get("talkaction.potions.flask") or false - if not deactivatedFlasks then - if fromPosition.x == CONTAINER_POSITION then - local container = Container(item:getParent().uid) - container:addItem(potion.flask, 1) - else - player:addItem(potion.flask, 1) - end - end - player:addCondition(exhaust) - player:setStorageValue(38412, player:getStorageValue(38412) + 1) - end - - player:getPosition():sendSingleSoundEffect(SOUND_EFFECT_TYPE_ITEM_USE_POTION, player:isInGhostMode() and nil or player) - -- Delay potion - _G.PlayerDelayPotion[player:getId()] = systemTime() + 500 - - if potion.func then - potion.func(player) - player:say("Aaaah...", MESSAGE_POTION) - player:getPosition():sendMagicEffect(potion.effect) - end - - if potion.condition then - player:addCondition(potion.condition) - player:say(potion.text, MESSAGE_POTION) - player:getPosition():sendMagicEffect(potion.effect) - end - - if potion.transform then - if item:getCount() >= 1 then - item:remove(1) - player:addItem(potion.transform.id[math.random(#potion.transform.id)], 1) - item:getPosition():sendMagicEffect(potion.effect) - return true - end - end - - if not configManager.getBoolean(configKeys.REMOVE_POTION_CHARGES) then - return true - end - - player:updateSupplyTracker(item) - item:remove(1) - return true -end - -for index, value in pairs(potions) do - flaskPotion:id(index) -end - -flaskPotion:register() diff --git a/data/global.lua b/data/global.lua index 1491987ffad..dbd9a8036bf 100644 --- a/data/global.lua +++ b/data/global.lua @@ -99,11 +99,6 @@ if not _G.NextUseConcoctionTime then _G.NextUseConcoctionTime = {} end --- Delay potion -if not _G.PlayerDelayPotion then - _G.PlayerDelayPotion = {} -end - table.contains = function(array, value) for _, targetColumn in pairs(array) do if targetColumn == value then diff --git a/data/scripts/actions/items/potions.lua b/data/scripts/actions/items/potions.lua new file mode 100644 index 00000000000..b1b731219c9 --- /dev/null +++ b/data/scripts/actions/items/potions.lua @@ -0,0 +1,140 @@ +local berserk = Condition(CONDITION_ATTRIBUTES) +berserk:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) +berserk:setParameter(CONDITION_PARAM_SUBID, AttrSubId_JeanPierreMelee) +berserk:setParameter(CONDITION_PARAM_SKILL_MELEE, 5) +berserk:setParameter(CONDITION_PARAM_SKILL_SHIELD, -10) +berserk:setParameter(CONDITION_PARAM_BUFF_SPELL, true) + +local mastermind = Condition(CONDITION_ATTRIBUTES) +mastermind:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) +mastermind:setParameter(CONDITION_PARAM_SUBID, AttrSubId_JeanPierreMagic) +mastermind:setParameter(CONDITION_PARAM_STAT_MAGICPOINTS, 3) +mastermind:setParameter(CONDITION_PARAM_BUFF_SPELL, true) + +local bullseye = Condition(CONDITION_ATTRIBUTES) +bullseye:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) +bullseye:setParameter(CONDITION_PARAM_SUBID, AttrSubId_JeanPierreDistance) +bullseye:setParameter(CONDITION_PARAM_SKILL_DISTANCE, 5) +bullseye:setParameter(CONDITION_PARAM_SKILL_SHIELD, -10) +bullseye:setParameter(CONDITION_PARAM_BUFF_SPELL, true) + +local antidote = Combat() +antidote:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING) +antidote:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) +antidote:setParameter(COMBAT_PARAM_DISPEL, CONDITION_POISON) +antidote:setParameter(COMBAT_PARAM_AGGRESSIVE, false) +antidote:setParameter(COMBAT_PARAM_TARGETCASTERORTOPMOST, true) + +local function magicshield(player) + local condition = Condition(CONDITION_MANASHIELD) + condition:setParameter(CONDITION_PARAM_TICKS, 60000) + condition:setParameter(CONDITION_PARAM_MANASHIELD, math.min(player:getMaxMana(), 300 + 7.6 * player:getLevel() + 7 * player:getMagicLevel())) + player:addCondition(condition) +end + +local potions = { + [236] = { health = { 250, 350 }, vocations = { VOCATION.BASE_ID.PALADIN, VOCATION.BASE_ID.KNIGHT }, level = 50, flask = 283, description = "Only knights and paladins of level 50 or above may drink this fluid." }, + [237] = { mana = { 115, 185 }, level = 50, flask = 283, description = "Only players of level 50 or above may drink this fluid." }, + [238] = { mana = { 150, 250 }, vocations = { VOCATION.BASE_ID.SORCERER, VOCATION.BASE_ID.DRUID, VOCATION.BASE_ID.PALADIN }, level = 80, flask = 284, description = "Only sorcerers, druids and paladins of level 80 or above may drink this fluid." }, + [239] = { health = { 425, 575 }, vocations = { VOCATION.BASE_ID.KNIGHT }, level = 80, flask = 284, description = "Only knights of level 80 or above may drink this fluid." }, + [266] = { health = { 125, 175 }, flask = 285 }, + [268] = { mana = { 75, 125 }, flask = 285 }, + [6558] = { transform = { id = { 236, 237 } }, effect = CONST_ME_DRAWBLOOD }, + [7439] = { vocations = { VOCATION.BASE_ID.KNIGHT }, condition = berserk, effect = CONST_ME_MAGIC_RED, description = "Only knights may drink this potion.", text = "You feel stronger.", achievement = "Berserker" }, + [7440] = { vocations = { VOCATION.BASE_ID.SORCERER, VOCATION.BASE_ID.DRUID }, condition = mastermind, effect = CONST_ME_MAGIC_BLUE, description = "Only sorcerers and druids may drink this potion.", text = "You feel smarter.", achievement = "Mastermind" }, + [7443] = { vocations = { VOCATION.BASE_ID.PALADIN }, condition = bullseye, effect = CONST_ME_MAGIC_GREEN, description = "Only paladins may drink this potion.", text = "You feel more accurate.", achievement = "Sharpshooter" }, + [7642] = { health = { 250, 350 }, mana = { 100, 200 }, vocations = { VOCATION.BASE_ID.PALADIN }, level = 80, flask = 284, description = "Only paladins of level 80 or above may drink this fluid." }, + [7643] = { health = { 650, 850 }, vocations = { VOCATION.BASE_ID.KNIGHT }, level = 130, flask = 284, description = "Only knights of level 130 or above may drink this fluid." }, + [7644] = { combat = antidote, flask = 285 }, + [7876] = { health = { 60, 90 }, flask = 285 }, + [23373] = { mana = { 425, 575 }, vocations = { VOCATION.BASE_ID.SORCERER, VOCATION.BASE_ID.DRUID }, level = 130, flask = 284, description = "Only druids and sorcerers of level 130 or above may drink this fluid." }, + [23374] = { health = { 420, 580 }, mana = { 250, 350 }, vocations = { VOCATION.BASE_ID.PALADIN }, level = 130, flask = 284, description = "Only paladins of level 130 or above may drink this fluid." }, + [23375] = { health = { 875, 1125 }, vocations = { VOCATION.BASE_ID.KNIGHT }, level = 200, flask = 284, description = "Only knights of level 200 or above may drink this fluid." }, + [35563] = { vocations = { VOCATION.BASE_ID.SORCERER, VOCATION.BASE_ID.DRUID }, level = 14, func = magicshield, effect = CONST_ME_ENERGYAREA, description = "Only sorcerers and druids of level 14 or above may drink this potion." }, +} + +local flaskPotion = Action() + +function flaskPotion.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if not target or type(target) == "userdata" and not target:isPlayer() then + return false + end + + local potion = potions[item:getId()] + if not player:getGroup():getAccess() and (potion.level and player:getLevel() < potion.level or potion.vocations and not table.contains(potion.vocations, player:getVocation():getBaseId())) then + player:say(potion.description, MESSAGE_POTION) + return true + end + + if potion.health or potion.mana or potion.combat then + if potion.health then + doTargetCombatHealth(player, target, COMBAT_HEALING, potion.health[1], potion.health[2], CONST_ME_MAGIC_BLUE) + end + + if potion.mana then + doTargetCombatMana(0, target, potion.mana[1], potion.mana[2], CONST_ME_MAGIC_BLUE) + end + + if potion.combat then + potion.combat:execute(target, Variant(target:getId())) + end + + if not potion.effect and target:getPosition() ~= nil then + target:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) + end + + player:addAchievementProgress("Potion Addict", 100000) + target:say("Aaaah...", MESSAGE_POTION) + + local deactivatedFlasks = player:kv():get("talkaction.potions.flask") or false + if not deactivatedFlasks then + local container = Container(item:getParent().uid) + local inbox = player:getSlotItem(CONST_SLOT_STORE_INBOX) + + if fromPosition.x == CONTAINER_POSITION and container ~= inbox and container:getEmptySlots() ~= 0 then + container:addItem(potion.flask, 1) + else + Game.createItem(potion.flask, 1, fromPosition) + end + end + end + + player:getPosition():sendSingleSoundEffect(SOUND_EFFECT_TYPE_ITEM_USE_POTION, player:isInGhostMode() and nil or player) + + if potion.func then + potion.func(player) + player:say("Aaaah...", MESSAGE_POTION) + player:getPosition():sendMagicEffect(potion.effect) + player:addAchievementProgress(potion.achievement, 100) + end + + if potion.condition then + player:addCondition(potion.condition) + player:say(potion.text, MESSAGE_POTION) + player:getPosition():sendMagicEffect(potion.effect) + end + + if potion.transform then + if item:getCount() >= 1 then + item:remove(1) + player:addItem(potion.transform.id[math.random(#potion.transform.id)], 1) + item:getPosition():sendMagicEffect(potion.effect) + player:addAchievementProgress("Demonic Barkeeper", 250) + return true + end + end + + if not configManager.getBoolean(configKeys.REMOVE_POTION_CHARGES) then + return true + end + + player:updateSupplyTracker(item) + item:remove(1) + return true +end + +for index, value in pairs(potions) do + flaskPotion:id(index) +end + +flaskPotion:register()