what change/edit that potion wont transfer to empty vial?
fluid ->
potions ->
fluid ->
local drunk = Condition(CONDITION_DRUNK)
drunk:setParameter(CONDITION_PARAM_TICKS, 60000)
local poison = Condition(CONDITION_POISON)
poison:setParameter(CONDITION_PARAM_DELAYED, true)
poison:setParameter(CONDITION_PARAM_MINVALUE, -50)
poison:setParameter(CONDITION_PARAM_MAXVALUE, -120)
poison:setParameter(CONDITION_PARAM_STARTVALUE, -5)
poison:setParameter(CONDITION_PARAM_TICKINTERVAL, 4000)
poison:setParameter(CONDITION_PARAM_FORCEUPDATE, true)
local fluidMessage = {
[3] = 'Aah...',
[4] = 'Urgh!',
[5] = 'Mmmh.',
[7] = 'Aaaah...',
[10] = 'Aaaah...',
[11] = 'Urgh!',
[13] = 'Urgh!',
[15] = 'Aah...',
[19] = 'Urgh!',
[43] = 'Aaaah...'
}
local function graveStoneTeleport(cid, fromPosition, toPosition)
local player = Player(cid)
if not player then
return true
end
player:teleportTo(toPosition)
player:say('Muahahahaha..', TALKTYPE_MONSTER_SAY, false, player)
fromPosition:sendMagicEffect(CONST_ME_DRAWBLOOD)
toPosition:sendMagicEffect(CONST_ME_MORTAREA)
end
-- Special poison condition used on dawnport residents
-- Doesnt allow poison yourself when health is <= 10 or your health go low than 10 due poison
function dawnportPoisonCondition(player)
local health = player:getHealth();
local minHealth = 10
-- Default poison values (not possible read condition parameters)
local startValue = 5
local minPoisonDamage = 50
local maxPoisonDamage = 120
-- Special poison
if health > minHealth and health < (minHealth + maxPoisonDamage) then
local maxValue = health - minHealth
local minValue = minPoisonDamage
local value = startValue
local minRoundsDamage = (startValue * (startValue + 1) / 2)
if maxValue < minPoisonDamage then
minValue = maxValue
end
if maxValue < minRoundsDamage then
value = math.floor( math.sqrt(maxValue) )
end
local poisonMod = Condition(CONDITION_POISON)
poisonMod:setParameter(CONDITION_PARAM_DELAYED, true)
poisonMod:setParameter(CONDITION_PARAM_MINVALUE, -minValue)
poisonMod:setParameter(CONDITION_PARAM_MAXVALUE, -maxValue)
poisonMod:setParameter(CONDITION_PARAM_STARTVALUE, -value)
poisonMod:setParameter(CONDITION_PARAM_TICKINTERVAL, 4000)
poisonMod:setParameter(CONDITION_PARAM_FORCEUPDATE, true)
player:addCondition(poisonMod)
-- Common poison
elseif health >= (minHealth + maxPoisonDamage) then
player:addCondition(poison)
end
-- Otherwise no poison
end
local fluid = Action()
function fluid.onUse(player, item, fromPosition, target, toPosition, isHotkey)
local targetType = ItemType(target.itemid)
if targetType:isFluidContainer() then
if target.type == 0 and item.type ~= 0 then
target:transform(target.itemid, item.type)
item:transform(item.itemid, 0)
return true
elseif target.type ~= 0 and item.type == 0 then
target:transform(target.itemid, 0)
item:transform(item.itemid, target.type)
return true
end
end
if target.itemid == 29312 then
if item.type == 0 then
player:sendTextMessage(MESSAGE_FAILURE, 'It is empty.')
elseif item.type == 1 then
toPosition:sendMagicEffect(CONST_ME_WATER_SPLASH)
target:transform(target.itemid + 1)
item:transform(item.itemid, 0)
else
player:sendTextMessage(MESSAGE_FAILURE, 'You need water.')
end
return true
end
if target.itemid == 1 then
if item.type == 0 then
player:sendTextMessage(MESSAGE_FAILURE, 'It is empty.')
elseif target.uid == player.uid then
if isInArray({3, 15, 43}, item.type) then
player:addCondition(drunk)
elseif item.type == 4 then
local town = player:getTown()
if town and town:getId() == TOWNS_LIST.DAWNPORT then
dawnportPoisonCondition(player)
else
player:addCondition(poison)
end
elseif item.type == 7 then
player:addMana(math.random(50, 150))
fromPosition:sendMagicEffect(CONST_ME_MAGIC_BLUE)
elseif item.type == 10 then
player:addHealth(60)
fromPosition:sendMagicEffect(CONST_ME_MAGIC_BLUE)
end
player:say(fluidMessage[item.type] or 'Gulp.', TALKTYPE_MONSTER_SAY)
item:transform(item.itemid, 0)
else
local pool = Game.createItem(2016, item.type, toPosition)
if pool then
pool:decay()
if item.type == 1 then
checkWallArito(pool, toPosition)
end
end
item:transform(item.itemid, 0)
end
else
local fluidSource = targetType:getFluidSource()
if fluidSource ~= 0 then
item:transform(item.itemid, fluidSource)
elseif item.type == 0 then
player:sendTextMessage(MESSAGE_FAILURE, 'It is empty.')
else
if item.type == 2 and target.actionid == 2023 then
toPosition.y = toPosition.y + 1
local creatures, destination = Tile(toPosition):getCreatures(), Position(32791, 32332, 10)
if #creatures == 0 then
graveStoneTeleport(player.uid, fromPosition, destination)
else
local creature
for i = 1, #creatures do
creature = creatures
if creature and creature:isPlayer() then
graveStoneTeleport(creature.uid, toPosition, destination)
end
end
end
else
if toPosition.x == CONTAINER_POSITION then
toPosition = player:getPosition()
end
local pool = Game.createItem(2016, item.type, toPosition)
if pool then
pool:decay()
if item.type == 1 then
checkWallArito(pool, toPosition)
end
end
end
item:transform(item.itemid, 0)
end
end
return true
end
fluid:id(1775, 2005, 2006, 2007, 2008, 2009, 2011, 2012, 2013, 2014, 2015, 2023, 2031, 2032, 2033, 2034, 2562, 2574, 2575, 2576, 2577)
fluid:register()
potions ->
local berserk = Condition(CONDITION_ATTRIBUTES)
berserk:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000)
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_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_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 = {7588, 7589}
},
effect = CONST_ME_DRAWBLOOD
},
[7439] = {
vocations = {
VOCATION.CLIENT_ID.KNIGHT
},
condition = berserk,
effect = CONST_ME_MAGIC_RED,
description = "Only knights may drink this potion.",
text = "You feel stronger."
},
[7440] = {
vocations = {
VOCATION.CLIENT_ID.SORCERER,
VOCATION.CLIENT_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.CLIENT_ID.PALADIN
},
condition = bullseye,
effect = CONST_ME_MAGIC_GREEN,
description = "Only paladins may drink this potion.",
text = "You feel more accurate."
},
[40398] = {
vocations = {
VOCATION.CLIENT_ID.SORCERER,
VOCATION.CLIENT_ID.DRUID
},
level = 14,
func = magicshield,
effect = CONST_ME_ENERGYAREA,
description = "Only sorcerers and druids of level 14 or above may drink this potion.",
},
[7588] = {
health = {
250,
350
},
vocations = {
VOCATION.CLIENT_ID.PALADIN,
VOCATION.CLIENT_ID.KNIGHT
},
level = 50,
flask = 7634,
description = "Only knights and paladins of level 50 or above may drink this fluid."
},
[7589] = {
mana = {
115,
185
},
level = 50,
flask = 7634,
description = "Only players of level 50 or above may drink this fluid."
},
[7590] = {
mana = {
150,
250
},
vocations = {
VOCATION.CLIENT_ID.SORCERER,
VOCATION.CLIENT_ID.DRUID,
VOCATION.CLIENT_ID.PALADIN
},
level = 80,
flask = 7635,
description = "Only sorcerers, druids and paladins of level 80 or above may drink this fluid."
},
[7591] = {
health = {
425,
575
},
vocations = {
VOCATION.CLIENT_ID.KNIGHT
},
level = 80,
flask = 7635,
description = "Only knights of level 80 or above may drink this fluid."
},
[7618] = {
health = {
125,
175
},
flask = 7636
},
[7620] = {
mana = {
75,
125
},
flask = 7636
},
[8472] = {
health = {
250,
350
},
mana = {
100,
200
},
vocations = {
VOCATION.CLIENT_ID.PALADIN
},
level = 80,
flask = 7635,
description = "Only paladins of level 80 or above may drink this fluid."
},
[8473] = {
health = {650, 850},
vocations = {
VOCATION.CLIENT_ID.KNIGHT
},
level = 130,
flask = 7635,
description = "Only knights of level 130 or above may drink this fluid."
},
[8474] = {
combat = antidote,
flask = 7636
},
[8704] = {
health = {
60,
90
},
flask = 7636
},
[26029] = {
mana = {
425,
575
},
vocations = {
VOCATION.CLIENT_ID.SORCERER,
VOCATION.CLIENT_ID.DRUID
},
level = 130,
flask = 7635,
description = "Only druids and sorcerers of level 130 or above may drink this fluid."
},
[26030] = {
health = {
420,
580
},
mana = {
250,
350
},
vocations = {
VOCATION.CLIENT_ID.PALADIN
},
level = 130,
flask = 7635,
description = "Only paladins of level 130 or above may drink this fluid."
},
[26031] = {
health = {
875,
1125
},
vocations = {
VOCATION.CLIENT_ID.KNIGHT
},
level = 200,
flask = 7635,
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 type(target) == "userdata" and not target:isPlayer() then
return false
end
-- Delay potion
if not playerDelayPotion[player:getId()] then
playerDelayPotion[player:getId()] = 0
end
if playerDelayPotion[player:getId()] > os.mtime() 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():getClientId()) and not (player:getGroup():getId() >= 2) 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(0, 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
player:addAchievementProgress('Potion Addict', 100000)
target:say("Aaaah...", MESSAGE_POTION)
player:addItem(potion.flask, 1)
player:addCondition(exhaust)
player:setStorageValue(38412, player:getStorageValue(38412)+1)
end
-- Delay potion
playerDelayPotion[player:getId()] = os.mtime() + 500
if potion.func then
potion.func(player)
if potion.text then
player:say(potion.text, MESSAGE_POTION)
end
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()