• 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!

Lua Zombie event

beliar34

Member
Joined
Feb 28, 2012
Messages
307
Solutions
7
Reaction score
11
Code:
[4:1:05.056] [Error - GlobalEvent Interface]
[4:1:05.056] data/globalevents/scripts/zombie/onthink.lua:onThink
[4:1:05.056] Description:
[4:1:05.056] data/lib/zombie_event.lua:105: bad argument #2 to 'random' (interval is empty)
[4:1:05.056] stack traceback:
[4:1:05.056]    [C]: in function 'random'
[4:1:05.056]    data/lib/zombie_event.lua:105: in function 'spawnNewZombie'
[4:1:05.056]    data/globalevents/scripts/zombie/onthink.lua:6: in function <data/globalevents/scripts/zombie/onthink.lua:1>
[4:1:05.056] [Error - GlobalEvents::think] Couldn't execute event: ZombieGlobalThink
I use : Zombie event - NEW version, bug free, updated

any ideas why this error apears ? tfs 0.4 rev 3777
 
Solution
did you copy the config?
Lua:
ZE_spawnFromPosition = {x = 1617, y = 1514, z = 7}
ZE_spawnToPosition =  {x = 1671, y = 1565, z = 7}

Code:
-- CONFIG
ZE_DEFAULT_NUMBER_OF_PLAYERS = 2
ZE_ACCESS_TO_IGNORE_ARENA = 8
-- POSITIONS
ZE_blockEnterItemPosition = {x= 1036, y=1018, z=7}
ZE_enterPosition = {x = 1000, y = 852, z = 7}
ZE_kickPosition = {x=1024, y=1024, z=7}
ZE_spawnFromPosition = {x = 1638, y = 1524, z = 7}
ZE_spawnToPosition = {x = 1662, y = 1498, z = 7}
-- ITEM IDS
ZE_blockEnterItemID = 387
-- STORAGES
-- - player
ZE_isOnZombieArea = 34370
-- - global
ZE_STATUS = 34370 -- =< 0 - off, 1 - waiting for players, 2 - is running
ZE_PLAYERS_NUMBER = 10
ZE_ZOMBIES_TO_SPAWN = 5
ZE_ZOMBIES_SPAWNED = 5
-- FUNCTION
function...
did you copy the config?
Lua:
ZE_spawnFromPosition = {x = 1617, y = 1514, z = 7}
ZE_spawnToPosition =  {x = 1671, y = 1565, z = 7}
 
did you copy the config?
Lua:
ZE_spawnFromPosition = {x = 1617, y = 1514, z = 7}
ZE_spawnToPosition =  {x = 1671, y = 1565, z = 7}

Code:
-- CONFIG
ZE_DEFAULT_NUMBER_OF_PLAYERS = 2
ZE_ACCESS_TO_IGNORE_ARENA = 8
-- POSITIONS
ZE_blockEnterItemPosition = {x= 1036, y=1018, z=7}
ZE_enterPosition = {x = 1000, y = 852, z = 7}
ZE_kickPosition = {x=1024, y=1024, z=7}
ZE_spawnFromPosition = {x = 1638, y = 1524, z = 7}
ZE_spawnToPosition = {x = 1662, y = 1498, z = 7}
-- ITEM IDS
ZE_blockEnterItemID = 387
-- STORAGES
-- - player
ZE_isOnZombieArea = 34370
-- - global
ZE_STATUS = 34370 -- =< 0 - off, 1 - waiting for players, 2 - is running
ZE_PLAYERS_NUMBER = 10
ZE_ZOMBIES_TO_SPAWN = 5
ZE_ZOMBIES_SPAWNED = 5
-- FUNCTION
function setZombiesEventPlayersLimit(value)
    doSetStorage(ZE_PLAYERS_NUMBER, value)
end
function getZombiesEventPlayersLimit()
    return getStorage(ZE_PLAYERS_NUMBER)
end
function addPlayerToZombiesArea(cid)
    doSendMagicEffect(getThingPosition(cid), CONST_ME_TELEPORT)
    doTeleportThing(cid, ZE_enterPosition, true)
    doSendMagicEffect(getThingPosition(cid), CONST_ME_TELEPORT)
    if(getPlayerAccess(cid) < ZE_ACCESS_TO_IGNORE_ARENA) then
        setPlayerZombiesEventStatus(cid, os.time())
    end
end
function kickPlayerFromZombiesArea(cid)
    doSendMagicEffect(getThingPosition(cid), CONST_ME_TELEPORT)
    doTeleportThing(cid, ZE_kickPosition, true)
    doSendMagicEffect(getThingPosition(cid), CONST_ME_TELEPORT)
    setPlayerZombiesEventStatus(cid, 0)
end
function getPlayerZombiesEventStatus(cid)
    return getCreatureStorage(cid, ZE_isOnZombieArea)
end
function setPlayerZombiesEventStatus(cid, value)
    doCreatureSetStorage(cid, ZE_isOnZombieArea, value)
end
function getZombiesEventPlayers()
    local players = {}
    for i, cid in pairs(getPlayersOnline()) do
        if(getPlayerZombiesEventStatus(cid) > 0) then
            table.insert(players, cid)
        end
    end
    return players
end
function getZombiesCount()
    return getStorage(ZE_ZOMBIES_SPAWNED)
end
function addZombiesCount()
    doSetStorage(ZE_ZOMBIES_SPAWNED, getStorage(ZE_ZOMBIES_SPAWNED)+1)
end
function resetZombiesCount()
    doSetStorage(ZE_ZOMBIES_SPAWNED, 0)
end
function getZombiesToSpawnCount()
    return getStorage(ZE_ZOMBIES_TO_SPAWN)
end
function setZombiesToSpawnCount(count)
    doSetStorage(ZE_ZOMBIES_TO_SPAWN, count)
end
function addZombiesEventBlockEnterPosition()
    if(getTileItemById(ZE_blockEnterItemPosition, ZE_blockEnterItemID).uid == 0) then
        doCreateItem(ZE_blockEnterItemID, 1, ZE_blockEnterItemPosition)
    end
end
function removeZombiesEventBlockEnterPosition()
    local item = getTileItemById(ZE_blockEnterItemPosition, ZE_blockEnterItemID)
    if(item.uid ~= 0) then
        doRemoveItem(item.uid)
    end
end
function spawnNewZombie()
    local posx = {}
    local posy = {}
    local posz = {}
    local pir = {}
    for i=1, 5 do
        local posx_tmp = math.random(ZE_spawnFromPosition.x ,ZE_spawnToPosition.x)
        local posy_tmp = math.random(ZE_spawnFromPosition.y ,ZE_spawnToPosition.y)
        local posz_tmp = math.random(ZE_spawnFromPosition.z ,ZE_spawnToPosition.z)
        local pir_tmp = 0
        local spec = getSpectators({x=posx_tmp, y=posy_tmp, z=posz_tmp}, 3, 3, false)
        if(spec and #spec > 0) then
            for z, pid in pairs(spec) do
                if(isPlayer(pid)) then
                    pir_tmp = pir_tmp + 1
                end
            end
        end
        posx[i] = posx_tmp
        posy[i] = posy_tmp
        posz[i] = posz_tmp
        pir[i] = pir_tmp
    end
    local lowest_i = 1
    for i=2, 5 do
        if(pir[i] < pir[lowest_i]) then
            lowest_i = i
        end
    end
    local ret = (type(doCreateMonster("Zombie Event", {x=posx[lowest_i], y=posy[lowest_i], z=posz[lowest_i]}, false)) == 'number')
    if(ret) then
        addZombiesCount()
    end
    return ret
end

Code:
function onThink(interval, lastExecution, thinkInterval)
    if(getStorage(ZE_STATUS) == 2) then
        setZombiesToSpawnCount(getZombiesToSpawnCount()+1)
        local players = getZombiesEventPlayers()
        for i=1, getZombiesToSpawnCount() * 2 do
            if(getZombiesToSpawnCount() > 0 and spawnNewZombie()) then
                setZombiesToSpawnCount(getZombiesToSpawnCount()-1)
            end
        end
    end
    return true
end

EDIT :
FIX FOR FUTURE ADVENTURERS WITH THIS PROBLEM :D
Code:
math.random() with no arguments generates a real number between 0 and 1.
math.random(upper) generates integer numbers between 1 and upper.
math.random(lower, upper) generates integer numbers between lower and upper.

i got first HIGHER Y then LOWER Y and thats wrong, it must be LOWYER Y,HIGHER Y to make math.random :)

enjoy
 
Last edited:
Solution
Back
Top