Bug
New Member
- Joined
- Jan 7, 2011
- Messages
- 111
- Reaction score
- 1
Console gives me this error:
My actions-lua:
My functions:
Code:
[1:10:19.469] [Error - Action Interface]
[1:10:19.469] data/actions/scripts/tools/shovel.lua:onUse
[1:10:19.469] Description:
[1:10:19.469] data/lib/050-function.lua:10: bad argument #1 to 'ipairs' (table expected, got nil)
[1:10:19.469] stack traceback:
[1:10:19.469] [C]: in function 'ipairs'
[1:10:19.469] data/lib/050-function.lua:10: in function 'isInArray'
[1:10:19.469] data/actions/lib/actions.lua:230: in function <data/actions/lib/actions.lua:207>
[1:10:19.469] (tail call): ?
Code:
SPOTS = { 384, 418, 8278, 8592, 13189, 15635, 19518 }
ROPABLE = { 294, 369, 370, 383, 392, 408, 409, 427, 428, 430, 462, 469, 470, 482, 484, 485, 489, 924, 3135, 3136, 7933, 7938, 8170, 8286, 8285,
8284, 8281, 8280, 8279, 8277, 8276, 8323, 8380, 8567, 8585, 8596, 8595, 8249, 8250, 8251, 8252, 8253, 8254, 8255, 8256, 8972, 9606, 9625, 19518 }
HOLES = { 468, 481, 483, 7932, 8579 }
SAND = { 231, 9059 }
JUNGLE_GRASS = { 2782, 3985 }
SPIDER_WEB = { 7538, 7539 }
BAMBOO_FENCE = { 3798, 3799 }
WILD_GROWTH = { 1499, 11099 }
PUMPKIN = 2683
PUMPKIN_HEAD = 2096
POOL = 2016
SPECIAL_FOODS = {
[9992] = "Gulp.", [9993] = "Chomp.", [9994] = "Chomp.", [9995] = "Chomp.", [9997] = "Yum.",
[9998] = "Munch.", [9999] = "Chomp.", [10000] = "Mmmm.", [10001] = "Smack.", [12540] = "Yum.",
[12542] = "Gulp.", [12543] = "?", [12544] = "Slurp!"
}
DOORS = {
[1209] = 1211, [1212] = 1214, [1231] = 1233, [1234] = 1236, [1249] = 1251, [1252] = 1254, [3535] = 3537, [3544] = 3546, [4913] = 4915, [4916] = 4918,
[5098] = 5100, [5107] = 5109, [5116] = 5118, [5125] = 5127, [5134] = 5136, [5137] = 5139, [5140] = 5142, [5143] = 5145, [5278] = 5280, [5281] = 5283,
[5732] = 5734, [5735] = 5737, [6192] = 6194, [6195] = 6197, [6249] = 6251, [6252] = 6254, [6891] = 6893, [6900] = 6902, [7033] = 7035, [7042] = 7044,
[8541] = 8543, [8544] = 8546, [9165] = 9167, [9168] = 9170, [9267] = 9269, [9270] = 9272, [10268] = 10270, [10271] = 10273, [10468] = 10470,
[10477] = 10479, [10775] = 10777, [10784] = 10786, [12092] = 12094, [12099] = 12101, [12188] = 12190, [12197] = 12199
}
function destroyItem(cid, itemEx, toPosition)
if(itemEx.uid <= 65535 or itemEx.actionid > 0) then
return false
end
if(isInArray(SPIDER_WEB, itemEx.itemid)) then
if math.random(3) == 1 then
doTransformItem(itemEx.uid, (itemEx.itemid + 6))
doDecayItem(itemEx.uid)
end
doSendMagicEffect(toPosition, CONST_ME_POFF)
return true
end
if(isInArray(BAMBOO_FENCE, itemEx.itemid)) then
if math.random(3) == 1 then
if(itemEx.itemid == BAMBOO_FENCE[1]) then
doTransformItem(itemEx.uid, (itemEx.itemid + 161))
elseif(itemEx.itemid == BAMBOO_FENCE[2]) then
doTransformItem(itemEx.uid, (itemEx.itemid + 159))
end
doDecayItem(itemEx.uid)
end
doSendMagicEffect(toPosition, CONST_ME_POFF)
return true
end
if not(isInArray({1770, 2098, 1774, 2064, 2094, 2095, 1619, 2602, 3805, 3806}, itemEx.itemid) or
(itemEx.itemid >= 1724 and itemEx.itemid <= 1741) or
(itemEx.itemid >= 2581 and itemEx.itemid <= 2588) or
(itemEx.itemid >= 1747 and itemEx.itemid <= 1753) or
(itemEx.itemid >= 1714 and itemEx.itemid <= 1717) or
(itemEx.itemid >= 1650 and itemEx.itemid <= 1653) or
(itemEx.itemid >= 1666 and itemEx.itemid <= 1677) or
(itemEx.itemid >= 1614 and itemEx.itemid <= 1616) or
(itemEx.itemid >= 3813 and itemEx.itemid <= 3820) or
(itemEx.itemid >= 3807 and itemEx.itemid <= 3810) or
(itemEx.itemid >= 2080 and itemEx.itemid <= 2085) or
(itemEx.itemid >= 2116 and itemEx.itemid <= 2119)) then
return false
end
if(math.random(1, 7) == 1) then
if(isInArray({1738, 1739, 1770, 2098, 1774, 1775, 2064}, itemEx.itemid) or
(itemEx.itemid >= 2581 and itemEx.itemid <= 2588)) then
doCreateItem(2250, 1, toPosition)
elseif((itemEx.itemid >= 1747 and itemEx.itemid <= 1749) or itemEx.itemid == 1740) then
doCreateItem(2251, 1, toPosition)
elseif((itemEx.itemid >= 1714 and itemEx.itemid <= 1717)) then
doCreateItem(2252, 1, toPosition)
elseif((itemEx.itemid >= 1650 and itemEx.itemid <= 1653) or
(itemEx.itemid >= 1666 and itemEx.itemid <= 1677) or
(itemEx.itemid >= 1614 and itemEx.itemid <= 1616) or
(itemEx.itemid >= 3813 and itemEx.itemid <= 3820) or
(itemEx.itemid >= 3807 and itemEx.itemid <= 3810)) then
doCreateItem(2253, 1, toPosition)
elseif((itemEx.itemid >= 1724 and itemEx.itemid <= 1737) or
(itemEx.itemid >= 2080 and itemEx.itemid <= 2085) or
(itemEx.itemid >= 2116 and itemEx.itemid <= 2119) or
isInArray({2094, 2095}, itemEx.itemid)) then
doCreateItem(2254, 1, toPosition)
elseif((itemEx.itemid >= 1750 and itemEx.itemid <= 1753) or isInArray({1619, 1741}, itemEx.itemid)) then
doCreateItem(2255, 1, toPosition)
elseif(itemEx.itemid == 2602) then
doCreateItem(2257, 1, toPosition)
elseif(itemEx.itemid == 3805 or itemEx.itemid == 3806) then
doCreateItem(2259, 1, toPosition)
end
doRemoveItem(itemEx.uid, 1)
end
doSendMagicEffect(toPosition, CONST_ME_POFF)
return true
end
TOOLS = {}
TOOLS.ROPE = function(cid, item, fromPosition, itemEx, toPosition)
if(toPosition.x == CONTAINER_POSITION) then
doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTPOSSIBLE)
return true
end
toPosition.stackpos = STACKPOS_GROUND
errors(false)
local ground = getThingFromPos(toPosition)
errors(true)
if(isInArray(SPOTS, ground.itemid)) then
doTeleportThing(cid, {x = toPosition.x, y = toPosition.y + 1, z = toPosition.z - 1}, false)
return true
elseif(isInArray(ROPABLE, itemEx.itemid)) then
local canOnlyRopePlayers = getBooleanFromString(getConfigValue('canOnlyRopePlayers'))
local hole = getThingFromPos({x = toPosition.x, y = toPosition.y, z = toPosition.z + 1, stackpos = STACKPOS_TOP_MOVEABLE_ITEM_OR_CREATURE})
if(canOnlyRopePlayers) then
if(isPlayer(hole.uid) and (not isPlayerGhost(hole.uid) or getPlayerGhostAccess(cid) >= getPlayerGhostAccess(hole.uid))) then
doTeleportThing(hole.uid, {x = toPosition.x, y = toPosition.y + 1, z = toPosition.z}, false)
else
doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTPOSSIBLE)
end
else
if(hole.itemid > 0) then
doTeleportThing(hole.uid, {x = toPosition.x, y = toPosition.y + 1, z = toPosition.z}, false)
else
doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTPOSSIBLE)
end
end
return true
end
return false
end
TOOLS.PICK = function(cid, item, fromPosition, itemEx, toPosition)
errors(false)
local ground = getThingFromPos({x = toPosition.x, y = toPosition.y, z = toPosition.z + 1, stackpos = STACKPOS_GROUND})
errors(true)
if(isInArray(SPOTS, ground.itemid) and isInArray({354, 355}, itemEx.itemid)) then
doTransformItem(itemEx.uid, 392)
doDecayItem(itemEx.uid)
doSendMagicEffect(toPosition, CONST_ME_POFF)
return true
end
if(itemEx.itemid == 7200) then
doTransformItem(itemEx.uid, 7236)
doSendMagicEffect(toPosition, CONST_ME_BLOCKHIT)
return true
end
return false
end
TOOLS.MACHETE = function(cid, item, fromPosition, itemEx, toPosition, destroy)
if(isInArray(JUNGLE_GRASS, itemEx.itemid)) then
doTransformItem(itemEx.uid, itemEx.itemid - 1)
doDecayItem(itemEx.uid)
return true
end
if(isInArray(SPIDER_WEB, itemEx.itemid)) then
if math.random(3) == 1 then
doTransformItem(itemEx.uid, (itemEx.itemid + 6))
doDecayItem(itemEx.uid)
end
doSendMagicEffect(toPosition, CONST_ME_POFF)
return true
end
if(isInArray(BAMBOO_FENCE, itemEx.itemid)) then
if math.random(3) == 1 then
if(itemEx.itemid == BAMBOO_FENCE[1]) then
doTransformItem(itemEx.uid, (itemEx.itemid + 161))
elseif(itemEx.itemid == BAMBOO_FENCE[2]) then
doTransformItem(itemEx.uid, (itemEx.itemid + 159))
end
doDecayItem(itemEx.uid)
end
doSendMagicEffect(toPosition, CONST_ME_POFF)
return true
end
if(isInArray(WILD_GROWTH, itemEx.itemid)) then
doSendMagicEffect(toPosition, CONST_ME_POFF)
doRemoveItem(itemEx.uid)
return true
end
return destroy and destroyItem(cid, itemEx, toPosition) or false
end
TOOLS.SHOVEL = function(cid, item, fromPosition, itemEx, toPosition)
if(isInArray(HOLES, itemEx.itemid)) then
local newId = itemEx.itemid + 1
if(itemEx.itemid == 8579) then
newId = 8585
end
doTransformItem(itemEx.uid, newId)
doDecayItem(itemEx.uid)
elseif(isInArray(SAND, itemEx.itemid)) then
local rand = math.random(1, 100)
local ground = getThingFromPos({x = toPosition.x, y = toPosition.y, z = toPosition.z + 1, stackpos = STACKPOS_GROUND})
if(isInArray(SPOTS, ground.itemid) and rand <= 20) then
doTransformItem(itemEx.uid, 489)
doDecayItem(itemEx.uid)
elseif(rand >= 1 and rand <= 5) then
doCreateItem(2159, 1, toPosition)
elseif(rand > 85) then
doCreateMonster("Scarab", toPosition, false)
end
doSendMagicEffect(toPosition, CONST_ME_POFF)
end
if(isInArray(SWAMP, itemEx.itemid)) then
local rand = math.random(1, 100)
if(rand >= 9 and rand <= 10) then
doPlayerAddItem(cid, 20138, 1)
doCreatureSay(cid, "You pick up a Leech!", TALKTYPE_ORANGE_1)
elseif(rand > 85) then
end
doSendMagicEffect(toPosition, CONST_ME_YELLOW_RINGS)
end
return true
end
TOOLS.SCYTHE = function(cid, item, fromPosition, itemEx, toPosition, destroy)
if(itemEx.itemid == 2739) then
doTransformItem(itemEx.uid, 2737)
doCreateItem(2694, 1, toPosition)
doDecayItem(itemEx.uid)
return true
end
return destroy and destroyItem(cid, itemEx, toPosition) or false
end
TOOLS.KNIFE = function(cid, item, fromPosition, itemEx, toPosition)
if(itemEx.itemid ~= PUMPKIN) then
return false
end
doTransformItem(itemEx.uid, PUMPKIN_HEAD)
return true
end
Code:
function isInArray(array, value, caseSensitive)
if(caseSensitive == nil or caseSensitive == false) and type(value) == "string" then
local lowerValue = value:lower()
for _, _value in ipairs(array) do
if type(_value) == "string" and lowerValue == _value:lower() then
return true
end
end
else
for _, _value in ipairs(array) do
if (value == _value) then return true end
end
end
return false
end
function doPlayerGiveItem(cid, itemid, amount, subType)
local item = 0
if(isItemStackable(itemid)) then
item = doCreateItemEx(itemid, amount)
if(doPlayerAddItemEx(cid, item, true) ~= RETURNVALUE_NOERROR) then
return false
end
else
for i = 1, amount do
item = doCreateItemEx(itemid, subType)
if(doPlayerAddItemEx(cid, item, true) ~= RETURNVALUE_NOERROR) then
return false
end
end
end
return true
end
function doPlayerGiveItemContainer(cid, containerid, itemid, amount, subType)
for i = 1, amount do
local container = doCreateItemEx(containerid, 1)
for x = 1, getContainerCapById(containerid) do
doAddContainerItem(container, itemid, subType)
end
if(doPlayerAddItemEx(cid, container, true) ~= RETURNVALUE_NOERROR) then
return false
end
end
return true
end
function doPlayerTakeItem(cid, itemid, amount)
return getPlayerItemCount(cid, itemid) >= amount and doPlayerRemoveItem(cid, itemid, amount)
end
function doPlayerSellItem(cid, itemid, count, cost)
if(not doPlayerTakeItem(cid, itemid, count)) then
return false
end
if(not doPlayerAddMoney(cid, cost)) then
error('[doPlayerSellItem] Could not add money to: ' .. getPlayerName(cid) .. ' (' .. cost .. 'gp).')
end
return true
end
function doPlayerWithdrawMoney(cid, amount)
if(not getBooleanFromString(getConfigInfo('bankSystem'))) then
return false
end
local balance = getPlayerBalance(cid)
if(amount > balance or not doPlayerAddMoney(cid, amount)) then
return false
end
doPlayerSetBalance(cid, balance - amount)
return true
end
function doPlayerDepositMoney(cid, amount)
if(not getBooleanFromString(getConfigInfo('bankSystem'))) then
return false
end
if(not doPlayerRemoveMoney(cid, amount)) then
return false
end
doPlayerSetBalance(cid, getPlayerBalance(cid) + amount)
return true
end
function doPlayerAddStamina(cid, minutes)
return doPlayerSetStamina(cid, getPlayerStamina(cid) + minutes)
end
function isPremium(cid)
return (isPlayer(cid) and (getPlayerPremiumDays(cid) > 0 or getBooleanFromString(getConfigValue('freePremium'))))
end
function getMonthDayEnding(day)
if(day == "01" or day == "21" or day == "31") then
return "st"
elseif(day == "02" or day == "22") then
return "nd"
elseif(day == "03" or day == "23") then
return "rd"
end
return "th"
end
function getMonthString(m)
return os.date("%B", os.time{year = 1970, month = m, day = 1})
end
function getArticle(str)
return str:find("[AaEeIiOoUuYy]") == 1 and "an" or "a"
end
function doNumberFormat(i)
local str, found = string.gsub(i, "(%d)(%d%d%d)$", "%1,%2", 1), 0
repeat
str, found = string.gsub(str, "(%d)(%d%d%d),", "%1,%2,", 1)
until found == 0
return str
end
function doPlayerAddAddons(cid, addon)
for i = 0, table.maxn(maleOutfits) do
doPlayerAddOutfit(cid, maleOutfits[i], addon)
end
for i = 0, table.maxn(femaleOutfits) do
doPlayerAddOutfit(cid, femaleOutfits[i], addon)
end
end
function getTibiaTime(num)
local minutes, hours = getWorldTime(), 0
while (minutes > 60) do
hours = hours + 1
minutes = minutes - 60
end
if(num) then
return {hours = hours, minutes = minutes}
end
return {hours = hours < 10 and '0' .. hours or '' .. hours, minutes = minutes < 10 and '0' .. minutes or '' .. minutes}
end
function doWriteLogFile(file, text)
local f = io.open(file, "a+")
if(not f) then
return false
end
f:write("[" .. os.date("%d/%m/%Y %H:%M:%S") .. "] " .. text .. "\n")
f:close()
return true
end
function getExperienceForLevel(lv)
lv = lv - 1
return ((50 * lv * lv * lv) - (150 * lv * lv) + (400 * lv)) / 3
end
function doMutePlayer(cid, time)
local condition = createConditionObject(CONDITION_MUTED, (time == -1 and time or time * 1000))
return doAddCondition(cid, condition, false)
end
function doSummonCreature(name, pos)
local cid = doCreateMonster(name, pos, false, false)
if(not cid) then
cid = doCreateNpc(name, pos)
end
return cid
end
function getPlayersOnlineEx()
local players = {}
for i, cid in ipairs(getPlayersOnline()) do
table.insert(players, getCreatureName(cid))
end
return players
end
function getPlayerByName(name)
local cid = getCreatureByName(name)
return isPlayer(cid) and cid or nil
end
function isPlayer(cid)
return isCreature(cid) and cid >= AUTOID_PLAYERS and cid < AUTOID_MONSTERS
end
function isPlayerGhost(cid)
return isPlayer(cid) and (getCreatureCondition(cid, CONDITION_GAMEMASTER, GAMEMASTER_INVISIBLE, CONDITIONID_DEFAULT) or getPlayerFlagValue(cid, PLAYERFLAG_CANNOTBESEEN))
end
function isMonster(cid)
return isCreature(cid) and cid >= AUTOID_MONSTERS and cid < AUTOID_NPCS
end
function isNpc(cid)
-- Npc IDs are over int32_t range (which is default for lua_pushnumber),
-- therefore number is always a negative value.
return isCreature(cid) and (cid < 0 or cid >= AUTOID_NPCS)
end
function isUnderWater(cid)
return isInArray(underWater, getTileInfo(getCreaturePosition(cid)).itemid)
end
function doPlayerAddLevel(cid, amount, round)
local experience, level, amount = 0, getPlayerLevel(cid), amount or 1
if(amount > 0) then
experience = getExperienceForLevel(level + amount) - (round and getPlayerExperience(cid) or getExperienceForLevel(level))
else
experience = -((round and getPlayerExperience(cid) or getExperienceForLevel(level)) - getExperienceForLevel(level + amount))
end
return doPlayerAddExperience(cid, experience)
end
function doPlayerAddMagLevel(cid, amount)
local amount = amount or 1
for i = 1, amount do
doPlayerAddSpentMana(cid, getPlayerRequiredMana(cid, getPlayerMagLevel(cid, true) + 1) - getPlayerSpentMana(cid), false)
end
return true
end
function doPlayerAddSkill(cid, skill, amount, round)
local amount = amount or 1
if(skill == SKILL__LEVEL) then
return doPlayerAddLevel(cid, amount, round)
elseif(skill == SKILL__MAGLEVEL) then
return doPlayerAddMagLevel(cid, amount)
end
for i = 1, amount do
doPlayerAddSkillTry(cid, skill, getPlayerRequiredSkillTries(cid, skill, getPlayerSkillLevel(cid, skill) + 1) - getPlayerSkillTries(cid, skill), false)
end
return true
end
function isPrivateChannel(channelId)
return channelId >= CHANNEL_PRIVATE
end
function doBroadcastMessage(text, class)
local class = class or MESSAGE_STATUS_WARNING
if(type(class) == 'string') then
local className = MESSAGE_TYPES[class]
if(className == nil) then
return false
end
class = className
elseif(class < MESSAGE_FIRST or class > MESSAGE_LAST) then
return false
end
for _, pid in ipairs(getPlayersOnline()) do
doPlayerSendTextMessage(pid, class, text)
end
print("> Broadcasted message: \"" .. text .. "\".")
return true
end
function doPlayerBroadcastMessage(cid, text, class, checkFlag, ghost)
local checkFlag, ghost, class = checkFlag or true, ghost or false, class or TALKTYPE_BROADCAST
if(checkFlag and not getPlayerFlagValue(cid, PLAYERFLAG_CANBROADCAST)) then
return false
end
if(type(class) == 'string') then
local className = TALKTYPE_TYPES[class]
if(className == nil) then
return false
end
class = className
elseif(class < TALKTYPE_FIRST or class > TALKTYPE_LAST) then
return false
end
for _, pid in ipairs(getPlayersOnline()) do
doCreatureSay(cid, text, class, ghost, pid)
end
print("> " .. getCreatureName(cid) .. " broadcasted message: \"" .. text .. "\".")
return true
end
function doCopyItem(item, attributes)
local attributes = ((type(attributes) == 'table') and attributes or { "aid" })
local ret = doCreateItemEx(item.itemid, item.type)
for _, key in ipairs(attributes) do
local value = getItemAttribute(item.uid, key)
if(value ~= nil) then
doItemSetAttribute(ret, key, value)
end
end
if(isContainer(item.uid)) then
for i = (getContainerSize(item.uid) - 1), 0, -1 do
local tmp = getContainerItem(item.uid, i)
if(tmp.itemid > 0) then
doAddContainerItemEx(ret, doCopyItem(tmp, true).uid)
end
end
end
return getThing(ret)
end
function doSetItemText(uid, text, writer, date)
local thing = getThing(uid)
if(thing.itemid < 100) then
return false
end
doItemSetAttribute(uid, "text", text)
if(writer ~= nil) then
doItemSetAttribute(uid, "writer", tostring(writer))
if(date ~= nil) then
doItemSetAttribute(uid, "date", tonumber(date))
end
end
return true
end
function getItemWeightById(itemid, count, precision)
local item, count, precision = getItemInfo(itemid), count or 1, precision or false
if(not item) then
return false
end
if(count > 100) then
-- print a warning, as its impossible to have more than 100 stackable items without "cheating" the count
print('[Warning] getItemWeightById', 'Calculating weight for more than 100 items!')
end
local weight = item.weight * count
return precission and weight or math.round(weight, 2)
end
function choose(...)
local arg, ret = {...}
if type(arg[1]) == 'table' then
ret = arg[1][math.random(#arg[1])]
else
ret = arg[math.random(#arg)]
end
return ret
end
function doPlayerAddExpEx(cid, amount)
if(not doPlayerAddExp(cid, amount)) then
return false
end
local position = getThingPosition(cid)
doPlayerSendTextMessage(cid, MESSAGE_EXPERIENCE, "You gained " .. amount .. " experience.", amount, COLOR_WHITE, position)
local spectators, name = getSpectators(position, 7, 7), getCreatureName(cid)
for _, pid in ipairs(spectators) do
if(isPlayer(pid) and cid ~= pid) then
doPlayerSendTextMessage(pid, MESSAGE_EXPERIENCE_OTHERS, name .. " gained " .. amount .. " experience.", amount, COLOR_WHITE, position)
end
end
return true
end
function getItemTopParent(uid)
local parent = getItemParent(uid)
if(not parent or parent.uid == 0) then
return nil
end
while(true) do
local tmp = getItemParent(parent.uid)
if(tmp and tmp.uid ~= 0) then
parent = tmp
else
break
end
end
return parent
end
function getItemHolder(uid)
local parent = getItemParent(uid)
if(not parent or parent.uid == 0) then
return nil
end
local holder = nil
while(true) do
local tmp = getItemParent(parent.uid)
if(tmp and tmp.uid ~= 0) then
if(tmp.itemid == 1) then -- a creature
holder = tmp
break
end
parent = tmp
else
break
end
end
return holder
end
function valid(f)
return function(p, ...)
if(isCreature(p)) then
return f(p, ...)
end
end
end