• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Solved Empty flask's not Stacking

marinho420

New Member
Joined
Nov 5, 2012
Messages
7
Reaction score
0
Hello, I wish someone could tell me what's wrong @ this bloody .xml script.

I'm moding a 8.6 server to have the "feel" of 7.4, just with newer graphics and a few stuff, and one of them is to be able to stack health pots and mana pots (all other pots are deactivated).

-EDIT: Only the flasks when someone used the potions, since the normal pots already stack!

If it wasn't for the Winning lottery ticket / mages playing (since Knights and paladins use UH and the old spells) I'd leave it the way it is, but due to those stuff I want them just to stack! :D

I'd be really grateful if someone could help me.

Code:
local config = {
 
removeOnUse = "no",
 
usableOnTarget = "no", -- can be used on target? (fe. healing friend)
 
splashable = "no",
 
range = -1,
 
realAnimation = "yes", -- make text effect visible only for players in range 1x1
 
multiplier = {
        health = 1.0,
        mana = 1.0
    }
}



config.removeOnUse = getBooleanFromString(config.removeOnUse)

config.usableOnTarget = getBooleanFromString(config.usableOnTarget)

config.splashable = getBooleanFromString(config.splashable)

config.realAnimation = getBooleanFromString(config.realAnimation)


local POTIONS = {
    [8704] = {empty = 7636, splash = 42, health = {50, 100}}, -- small health potion
    [7618] = {empty = 7636, splash = 42, health = {100, 200}}, -- health potion
    [7588] = {empty = 7634, splash = 42, health = {200, 400}, level = 50, vocations = {3, 4, 7, 8}, vocStr = "knights and paladins"}, -- strong health potion
    [7591] = {empty = 7635, splash = 42, health = {500, 700}, level = 80, vocations = {4, 8}, vocStr = "knights"}, -- great health potion
    [8473] = {empty = 7635, splash = 42, health = {800, 1000}, level = 130, vocations = {4, 8}, vocStr = "knights"}, -- ultimate health potion

    [7620] = {empty = 7636, splash = 47, mana = {70, 130}}, -- mana potion
    [7589] = {empty = 7634, splash = 47, mana = {110, 190}, level = 50, vocations = {1, 2, 3, 5, 6, 7}, vocStr = "sorcerers, druids and paladins"}, -- strong mana potion
    [7590] = {empty = 7635, splash = 47, mana = {200, 300}, level = 80, vocations = {1, 2, 5, 6}, vocStr = "sorcerers and druids"}, -- great mana potion

    [8472] = {empty = 7635, splash = 43, health = {200, 400}, mana = {110, 190}, level = 80, vocations = {3, 7}, vocStr = "paladins"}
}



local exhaust = createConditionObject(CONDITION_EXHAUST)

setConditionParam(exhaust, CONDITION_PARAM_TICKS, (getConfigInfo('timeBetweenExActions') - 100))



function onUse(cid, item, fromPosition, itemEx, toPosition)
 
local potion = POTIONS[item.itemid]
 
if(not potion) then
     
return false
 
end

 
if(not isPlayer(itemEx.uid) or (not config.usableOnTarget and cid ~= itemEx.uid)) then
     
if(not config.splashable) then
         
return false
     
end

     
if(toPosition.x == CONTAINER_POSITION) then
         
toPosition = getThingPosition(item.uid)
     
end

     
doDecayItem(doCreateItem(POOL, potion.splash, toPosition))
     
doRemoveItem(item.uid, 1)
     
if(not potion.empty or config.removeOnUse) then
         
return true
     
end

     
if(fromPosition.x ~= CONTAINER_POSITION) then
         
doCreateItem(potion.empty, fromPosition)
     
else
         
doPlayerAddItem(cid, potion.empty, 1)
     
end

     
return true
 
end

 
if(hasCondition(cid, CONDITION_EXHAUST)) then
     
doPlayerSendDefaultCancel(cid, RETURNVALUE_YOUAREEXHAUSTED)
     
return true
 
end

 
if(((potion.level and getPlayerLevel(cid) < potion.level) or (potion.vocations and not isInArray(potion.vocations, getPlayerVocation(cid)))) and
        not getPlayerCustomFlagValue(cid, PLAYERCUSTOMFLAG_GAMEMASTERPRIVILEGES))
    then
     
doCreatureSay(itemEx.uid, "Only " .. potion.vocStr .. (potion.level and (" of level " .. potion.level) or "") .. " or above may drink this fluid.", TALKTYPE_ORANGE_1)
     
return true
 
end

 
if(config.range > 0 and cid ~= itemEx.uid and getDistanceBetween(getCreaturePosition(cid), getCreaturePosition(itemEx.uid)) > config.range) then
     
return false
 
end

 
local health = potion.health
 
if(health and not doCreatureAddHealth(itemEx.uid, math.ceil(math.random(health[1], health[2]) * config.multiplier.health))) then
     
return false
 
end

 
local mana = potion.mana
 
if(mana and not doPlayerAddMana(itemEx.uid, math.ceil(math.random(mana[1], mana[2]) * config.multiplier.mana))) then
     
return false
 
end

 
doSendMagicEffect(getThingPosition(itemEx.uid), CONST_ME_MAGIC_BLUE)
 
if(not config.realAnimation) then
     
doCreatureSay(itemEx.uid, "Aaaah...", TALKTYPE_ORANGE_1)
 
else
     
for i, tid in ipairs(getSpectators(getThingPosition(itemEx.uid), 1, 1)) do
         
if(isPlayer(tid)) then
             
doCreatureSay(itemEx.uid, "Aaaah...", TALKTYPE_ORANGE_1, false, tid)
         
end
     
end
 
end

 
doAddCondition(cid, exhaust)
 
doRemoveItem(item.uid, 1)
 
if(not potion.empty or config.removeOnUse) then
     
return true
 
end

 
if(fromPosition.x ~= CONTAINER_POSITION) then
     
doCreateItem(potion.empty, fromPosition)
 
else
     
doPlayerAddItem(cid, potion.empty, 1)
 
end

 
return true

end
 
Last edited by a moderator:
Check your items.otb to see if the empty flask is stackable.

They are stackable, they just don't stack together as soon as someone used one of them, the "used/empty" flask will just take one extra space in the backpack or drop to the floor in case the backpack is full.
 
Alright Limos, I followed that Code, but it just wont work, I don't know if it should be build in before the line

doPlayerAddItem(cid, potion.empty, 1)

or afterwards, I don't know if I should replace it with your code, can you give me some detailed information? :)

Thanks!

---- EDIT ----

Nevermind -> I got it running!

Here is the code for the community, if they may need it somehow :)

local config = {

removeOnUse = "no",

usableOnTarget = "no", -- can be used on target? (fe. healing friend)

splashable = "no",

range = -1,

realAnimation = "yes", -- make text effect visible only for players in range 1x1

multiplier = {
health = 1.0,
mana = 1.0
}
}



config.removeOnUse = getBooleanFromString(config.removeOnUse)

config.usableOnTarget = getBooleanFromString(config.usableOnTarget)

config.splashable = getBooleanFromString(config.splashable)

config.realAnimation = getBooleanFromString(config.realAnimation)


local POTIONS = {
[8704] = {empty = 7636, splash = 42, health = {50, 100}}, -- small health potion
[7618] = {empty = 7636, splash = 42, health = {100, 200}}, -- health potion
[7588] = {empty = 7634, splash = 42, health = {200, 400}, level = 50, vocations = {3, 4, 7, 8}, vocStr = "knights and paladins"}, -- strong health potion
[7591] = {empty = 7635, splash = 42, health = {500, 700}, level = 80, vocations = {4, 8}, vocStr = "knights"}, -- great health potion
[8473] = {empty = 7635, splash = 42, health = {800, 1000}, level = 130, vocations = {4, 8}, vocStr = "knights"}, -- ultimate health potion

[7620] = {empty = 7636, splash = 47, mana = {70, 130}}, -- mana potion
[7589] = {empty = 7634, splash = 47, mana = {110, 190}, level = 50, vocations = {1, 2, 3, 5, 6, 7}, vocStr = "sorcerers, druids and paladins"}, -- strong mana potion
[7590] = {empty = 7635, splash = 47, mana = {200, 300}, level = 80, vocations = {1, 2, 5, 6}, vocStr = "sorcerers and druids"}, -- great mana potion

[8472] = {empty = 7635, splash = 43, health = {200, 400}, mana = {110, 190}, level = 80, vocations = {3, 7}, vocStr = "paladins"}
}



local exhaust = createConditionObject(CONDITION_EXHAUST)

setConditionParam(exhaust, CONDITION_PARAM_TICKS, (getConfigInfo('timeBetweenExActions') - 100))



function onUse(cid, item, fromPosition, itemEx, toPosition)

local potion = POTIONS[item.itemid]

if(not potion) then

return false

end


if(not isPlayer(itemEx.uid) or (not config.usableOnTarget and cid ~= itemEx.uid)) then

if(not config.splashable) then

return false

end


if(toPosition.x == CONTAINER_POSITION) then

toPosition = getThingPosition(item.uid)

end


doDecayItem(doCreateItem(POOL, potion.splash, toPosition))

doRemoveItem(item.uid, 1)

if(not potion.empty or config.removeOnUse) then

return true

end


if(fromPosition.x ~= CONTAINER_POSITION) then

doCreateItem(potion.empty, fromPosition)

else

doPlayerAddItem(cid, potion.empty, 1)


end


return true

end


if(hasCondition(cid, CONDITION_EXHAUST)) then

doPlayerSendDefaultCancel(cid, RETURNVALUE_YOUAREEXHAUSTED)

return true

end


if(((potion.level and getPlayerLevel(cid) < potion.level) or (potion.vocations and not isInArray(potion.vocations, getPlayerVocation(cid)))) and
not getPlayerCustomFlagValue(cid, PLAYERCUSTOMFLAG_GAMEMASTERPRIVILEGES))
then

doCreatureSay(itemEx.uid, "Only " .. potion.vocStr .. (potion.level and (" of level " .. potion.level) or "") .. " or above may drink this fluid.", TALKTYPE_ORANGE_1)

return true

end


if(config.range > 0 and cid ~= itemEx.uid and getDistanceBetween(getCreaturePosition(cid), getCreaturePosition(itemEx.uid)) > config.range) then

return false

end


local health = potion.health

if(health and not doCreatureAddHealth(itemEx.uid, math.ceil(math.random(health[1], health[2]) * config.multiplier.health))) then

return false

end


local mana = potion.mana

if(mana and not doPlayerAddMana(itemEx.uid, math.ceil(math.random(mana[1], mana[2]) * config.multiplier.mana))) then

return false

end


doSendMagicEffect(getThingPosition(itemEx.uid), CONST_ME_MAGIC_BLUE)

if(not config.realAnimation) then

doCreatureSay(itemEx.uid, "Aaaah...", TALKTYPE_ORANGE_1)

else

for i, tid in ipairs(getSpectators(getThingPosition(itemEx.uid), 1, 1)) do

if(isPlayer(tid)) then

doCreatureSay(itemEx.uid, "Aaaah...", TALKTYPE_ORANGE_1, false, tid)

end

end

end


doAddCondition(cid, exhaust)

doRemoveItem(item.uid, 1)

if(not potion.empty or config.removeOnUse) then

return true

end


if(fromPosition.x ~= CONTAINER_POSITION) then

doCreateItem(potion.empty, fromPosition)

else

local count = getPlayerItemCount(cid, potion.empty)
doPlayerRemoveItem(cid, potion.empty, count)
doPlayerAddItem(cid, potion.empty, count + 1)

end


return true

end
 
Last edited:
Back
Top