• 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 Fire-Storm event

freddzor11

Member
Joined
May 25, 2009
Messages
695
Reaction score
5
Hello! I using 0.3.6 and when I play FIRESTORM event then I getting theese errors, need some help with this... here is my script - http://pastebin.com/nnex4eRi

Code:
[Error - TalkAction Interface]
buffer:onSay
Description:
(luaCreateConditionObject) This function can only be used while loading the scri
pt.

[Error - TalkAction Interface]
buffer:onSay
Description:
(luaDoAddCondition) Condition not found

[Error - TalkAction Interface]
buffer:onSay
Description:
(luaCreateConditionObject) This function can only be used while loading the scri
pt.

[Error - TalkAction Interface]
buffer:onSay
Description:
(luaDoAddCondition) Condition not found

EDIT: also getting theese errors when it started
Code:
[Error - TalkAction Interface]
In a timer event called from:
buffer:onSay
Description:
(luaGetThingPosition) Thing not found

[Error - TalkAction Interface]
In a timer event called from:
buffer:onSay
Description:
[string "function doStartFireStormEvent()..."]:80: attempt to index local 'pPos'
(a boolean value)
stack traceback:
        [string "function doStartFireStormEvent()..."]:80: in function <[string
"function doStartFireStormEvent()..."]:75>

Best Regards,
Freddzor11


bump
 
Last edited by a moderator:
Line 200:
Code:
doAddCondition(cid, createConditionObject(CONDITION_INFIGHT, -1))

You shouldn't create condition objects within functions, create the condition object outside of the onSay-function and reference to it's variable, e.g:
Code:
local condition = createConditionObject(CONDITION_INFIGHT, -1)

function onSay(cid, words, param)
    doAddCondition(cid, condition))
end

Ignazio
 
Use this MOD :) work 100%

Code:
<?xml version="1.0" encoding="UTF-8"?>
<mod name="Fire_Storm_Event" version="3.0" author="CollocorpuseK" contact="otland.net" enabled="yes">

    <config name="config_fire_storm_event">
        <![CDATA[
            configFireStormEvent = {
                storages = {
                    main = '13335', -- set free storage
                    player = '13336', -- set free storage
                    joining = '13337', -- set free storage
                    exhaust = '13338', -- set free storage
                    countEvent = '13339' -- set free storage
                },
               
                position = {x=852 ,y=975,z=7}, -- position which player is teleported to
                room = {
                    from = {x=851,y=974,z=7}, -- left top corner of event room
                    to = {x=873,y=996,z=7} -- right bottom corner of event room
                },

                rewards = {2472, 8982, 5785, 2365}, -- reward id which player can win (reward is random)
                players = {
                    max = 50,
                    min = 2,
                    minLevel = 100
                },

                days = {
                    ['Tuesday'] = {'20:00:00'},
                    ['Thursday'] = {'18:37:00'},
                    ['Sunday'] = {'15:00:00'}
                },

                fireStormDelay = 1000, -- milisecond
               

                delayTime = 5.0, -- time in which players who joined to event are teleporting to teleport position
                startEvent = 1, -- time from teleport to start event
                text = 'To win and get a Rewards, stay as long as possible in the arena.'
            }

            fight = createConditionObject(CONDITION_INFIGHT)
            setConditionParam(fight, CONDITION_PARAM_TICKS, -1)
           
            y, x = 1, 1 -- don't change it
        ]]>
    </config>
   
    <lib name="lib_fire_storm_event">
        <![CDATA[
            function doStartFireStormEvent()
                doSetStorage(configFireStormEvent.storages.joining, -1)
               
                if configFireStormEvent.players.min <= doCountPlayersFireStormEvent() then       
                    for _, cid in ipairs(getPlayersOnline()) do
                        if getCreatureStorage(cid, configFireStormEvent.storages.player) > 0 then
                            doCreatureSetNoMove(cid, false)
                            doRemoveCondition(cid, CONDITION_INFIGHT)
                            doTeleportThing(cid, configFireStormEvent.position)
                            doCreatureSetStorage(cid, configFireStormEvent.storages.player, -1)
                           
                            doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, 'Get ready. Fire Storm starts in '..configFireStormEvent.startEvent..' seconds.')
                        end
                    end
                   
                    addEvent(doSetStorage, configFireStormEvent.startEvent * 1000, configFireStormEvent.storages.main, 1)
                    addEvent(doRepeatCheckFireStorm, configFireStormEvent.startEvent * 1000 + 2000)
                   
                    doBroadcastMessage('Fire Storm has started. LET\'S GO!')
                else
                    for _, cid in ipairs(getPlayersOnline()) do
                        if getCreatureStorage(cid, configFireStormEvent.storages.player) > 0 then
                            doCreatureSetNoMove(cid, false)
                            doRemoveCondition(cid, CONDITION_INFIGHT)
                        end
                    end
                   
                    doBroadcastMessage('Fire Storm hasn\'t started beacuse there were not enough players.')
                end
            end
           
            function doRepeatCheckFireStorm()
                if getStorage(configFireStormEvent.storages.main) > 0 then
                    local xTable, yTable, playerTable = {}, {}, {}

                    for x = configFireStormEvent.room.from.x, configFireStormEvent.room.to.x do
                        for y = configFireStormEvent.room.from.y, configFireStormEvent.room.to.y do
                            table.insert(xTable, x)
                            table.insert(yTable, y)

                            local n, i = getTileInfo({x=x, y=y, z=configFireStormEvent.room.to.z}).creatures, 1
                            if n ~= 0 then
                                local v = getThingfromPos({x=x, y=y, z=configFireStormEvent.room.to.z, stackpos=i}).uid
                                while v ~= 0 do
                                    if isPlayer(v) then
                                        table.insert(playerTable, v)
                                        if n == #playerTable then
                                            break
                                        end
                                    end
                                    i = i + 1
                                    v = getThingfromPos({x=x, y=y, z=configFireStormEvent.room.to.z, stackpos=i}).uid
                                end
                            end
                        end
                    end

                    if #playerTable == 1 then
                        local prize = math.random(#configFireStormEvent.rewards)
                        doCreatureAddHealth(playerTable[1], getCreatureMaxHealth(playerTable[1]) - getCreatureHealth(playerTable[1]))
                        doCreatureAddMana(playerTable[1], getCreatureMaxMana(playerTable[1]) - getCreatureMana(playerTable[1]))
                        doTeleportThing(playerTable[1], getTownTemplePosition(getPlayerTown(playerTable[1])), true)
                        doPlayerAddItem(playerTable[1], configFireStormEvent.rewards[prize], 1)
                        doPlayerSendTextMessage(playerTable[1], MESSAGE_EVENT_ADVANCE, 'You win! You have received ' .. getItemNameById(configFireStormEvent.rewards[prize]) .. ' as reward.')
                        doBroadcastMessage('Fire Storm has finished. The winner is ' .. getCreatureName(playerTable[1]) .. '. Congratulations.')
                        doSetStorage(configFireStormEvent.storages.main, -1)
                       
                        db.executeQuery("INSERT INTO `events` (`event_name`, `winner_name`, `won_item`, `time_win`) VALUES (\"Fire\", \"" .. getCreatureName(playerTable[1]) .. "\", \"" .. getItemNameById(configFireStormEvent.rewards[prize]) .. "\", " .. getStorage(configFireStormEvent.storages.countEvent) ..");")
                        doSetStorage(configFireStormEvent.storages.countEvent, getStorage(configFireStormEvent.storages.countEvent) + 1)
                       
                        x, y = 1, 1
                    elseif #playerTable > 1 then
                        for a = 1, y do
                            addEvent(
                                function()
                                    local pos = {x=xTable[math.random(#xTable)], y=yTable[math.random(#yTable)], z=7}

                                    for _, player in ipairs(playerTable) do
                                        local pPos = getThingPos(player)
                                        if pPos.x == pos.x and pPos.y == pos.y and pPos.z == pos.z then
                                            doCreatureAddHealth(player, - getCreatureMaxHealth(player))
                                        end
                                    end
                                    doSendDistanceShoot({x = pos.x - math.random(4, 6), y = pos.y - 5, z = pos.z}, pos, CONST_ANI_FIRE)

                                    addEvent(doSendMagicEffect, 150, pos, CONST_ME_HITBYFIRE)
                                    addEvent(doSendMagicEffect, 150, pos, CONST_ME_FIREAREA)
                                end,
                                math.random(100,1000)
                            )
                        end
                        if x == 5 * y then
                            y = y + 1
                        end
                       
                        x = x + 1
                    else
                        doBroadcastMessage('No one survived the Fire Storm.')
                        doSetStorage(configFireStormEvent.storages.main, -1)                       
                        doSetStorage(configFireStormEvent.storages.countEvent, getStorage(configFireStormEvent.storages.countEvent) + 1)
                        x, y = 1, 1
                    end
                   
                    addEvent(doRepeatCheckFireStorm, configFireStormEvent.fireStormDelay)
                end
            end
           
            function doCountPlayersFireStormEvent()
                local x = 0
                for _, cid in ipairs(getPlayersOnline()) do
                    if getCreatureStorage(cid, configFireStormEvent.storages.player) > 0 then
                        x = x + 1
                    end
                end
                return x
            end
           
            function doStartCountingFireStormEvent(x)
                if configFireStormEvent.delayTime-x > 0 then
                    doBroadcastMessage('Fire Storm will start in '..configFireStormEvent.delayTime-x..' minutes. You can join to the event by say "!fire join".')
                    addEvent(doStartCountingFireStormEvent, 60*1000, x+1)
                end
            end
        ]]>
    </lib>
 
part II

Code:
<talkaction words="!fire" event="script">
        <![CDATA[
            domodlib("config_fire_storm_event")

            function onSay(cid, words, param)
                if getStorage(configFireStormEvent.storages.joining) ~= 1 then
                    return doPlayerSendCancel(cid, 'Fire Storm hasn\'t started yet.')
                elseif param == '' then
                    return doPlayerSendCancel(cid, 'Command param required (say: "!fire join" or "!fire leave.").')
                elseif getPlayerLevel(cid) < configFireStormEvent.players.minLevel then
                    return doPlayerSendCancel(cid, 'You can\'t join to the event if you don\'t have a require '..configFireStormEvent.players.minLevel..' level.')
                elseif getTileInfo(getThingPos(cid)).protection ~= true then
                    return doPlayerSendCancel(cid, 'You can\'t join to the event if you aren\'t in protection zone.')
                elseif exhaustion.check(cid, configFireStormEvent.storages.exhaust) ~= false then
                    return doPlayerSendCancel(cid, 'You must wait '..exhaustion.get(cid, configFireStormEvent.storages.exhaust)..' seconds to use this command again.')
                end

                if param == 'join' then
                    if getCreatureStorage(cid, configFireStormEvent.storages.player) > 0 then
                        return doPlayerSendCancel(cid, 'You have arleady joined to event. Wait patiently for start.')
                    elseif doCountPlayersFireStormEvent() == configFireStormEvent.players.max then
                        return doPlayerSendCancel(cid, 'Max players in the event have been reached.')
                    end
                  
                    doCreatureSetNoMove(cid, true)
                    doPlayerPopupFYI(cid, configFireStormEvent.text)
                    doCreatureSetStorage(cid, configFireStormEvent.storages.player, 1)
                    doAddCondition(cid, fight)
                    doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, 'You have joined to Fire Storm Event. You can\'t move until event start. Wait patiently for the event start.')
                    doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'You have joined to Fire Storm Event.')
                elseif param == 'leave' then
                    if getCreatureStorage(cid, configFireStormEvent.storages.player) <= 0 then
                        return doPlayerSendCancel(cid, 'You can\'t leave from the event if you don\'t join.')
                    end
                  
                    doCreatureSetNoMove(cid, false)
                    doRemoveCondition(cid, CONDITION_INFIGHT)
                    doCreatureSetStorage(cid, configFireStormEvent.storages.player, -1)
                    doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'You have left from the Fire Storm Event.')
                end
              
                exhaustion.set(cid, configFireStormEvent.storages.exhaust, 5)
              
                return true
            end
        ]]>
    </talkaction>
  
    <talkaction words="!startfire" access="5" event="script">
        <![CDATA[
            domodlib("config_fire_storm_event")
            domodlib("lib_fire_storm_event")

            function onSay(cid, words, param)
                if getStorage(configFireStormEvent.storages.main) > 0 then
                    return doPlayerSendCancel(cid, 'Fire Storm Event is already running.')
                end
          
                doStartCountingFireStormEvent(0)
              
                for _, pid in ipairs(getPlayersOnline()) do
                    if getCreatureStorage(pid, configFireStormEvent.storages.player) > 0 then
                        doCreatureSetStorage(pid, configFireStormEvent.storages.player, -1)
                        doTeleportThing(pid, getTownTemplePosition(getPlayerTown(pid)), true)
                    end
                end
              
                doSetStorage(configFireStormEvent.storages.joining, 1)
                addEvent(doStartFireStormEvent, configFireStormEvent.delayTime * 60 * 1000)
                return true
            end
        ]]>
    </talkaction>

    <globalevent name="Fire_Storm_Event_Days" interval="1000" event="script">
        <![CDATA[
            domodlib("config_fire_storm_event")
            domodlib("lib_fire_storm_event")

            local daysOpen = {}          
            for k, v in pairs(configFireStormEvent.days) do
                table.insert(daysOpen, k)
            end
          
            function onThink(interval)
                if isInArray(daysOpen, os.date('%A')) then
                    if isInArray(configFireStormEvent.days[os.date('%A')], os.date('%X', os.time())) then
                        if getStorage(configFireStormEvent.storages.joining) ~= 1 then
                            doStartCountingFireStormEvent(0)
                          
                            for _, pid in ipairs(getPlayersOnline()) do
                                if getCreatureStorage(pid, configFireStormEvent.storages.player) > 0 then
                                    doCreatureSetStorage(pid, configFireStormEvent.storages.player, -1)
                                    doTeleportThing(pid, getTownTemplePosition(getPlayerTown(pid)), true)
                                end
                            end
                          
                            doSetStorage(configFireStormEvent.storages.joining, 1)
                            addEvent(doStartFireStormEvent, configFireStormEvent.delayTime * 60 * 1000)
                        end
                    end
                end
                return true
            end
        ]]>
    </globalevent>

    <event type="statschange" name="Fire_Storm_Event_Dead" event="script">
        <![CDATA[
            domodlib("config_fire_storm_event")

            function onStatsChange(cid, attacker, type, combat, value)
                if type == 1 and getCreatureHealth(cid) <= value then
                    if isInRange(getThingPos(cid), configFireStormEvent.room.from, configFireStormEvent.room.to) then
                        doCreatureAddHealth(cid, getCreatureMaxHealth(cid) - getCreatureHealth(cid))
                        doCreatureAddMana(cid, getCreatureMaxMana(cid) - getCreatureMana(cid))
                        doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
                        doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'You loss.')
                        return false
                    end
                end
                return true
            end
        ]]>
    </event>
  
    <event type="login" name="Fire_Storm_Event_Login" event="script">
        <![CDATA[
            domodlib("config_fire_storm_event")
      
            function onLogin(cid)
                if getCreatureStorage(cid, configFireStormEvent.storages.player) > 0 then
                    doCreatureSetStorage(cid, configFireStormEvent.storages.player, -1)
                    doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), true)
                    doCreatureSetNoMove(cid, false)
                    doRemoveCondition(cid, CONDITION_INFIGHT)
                end

                registerCreatureEvent(cid, 'Fire_Storm_Event_Dead')
                return true
            end
        ]]>
    </event>
  
    <globalevent name="Fire_Storm_Event_Start" type="startup" event="script">
        <![CDATA[
            domodlib("config_fire_storm_event")

            function onStartup()
                doSetStorage(configFireStormEvent.storages.main, -1)
                doSetStorage(configFireStormEvent.storages.joining, -1)
                return true
            end
        ]]>
    </globalevent>
</mod>
 
part II

Code:
<talkaction words="!fire" event="script">
        <![CDATA[
            domodlib("config_fire_storm_event")

            function onSay(cid, words, param)
                if getStorage(configFireStormEvent.storages.joining) ~= 1 then
                    return doPlayerSendCancel(cid, 'Fire Storm hasn\'t started yet.')
                elseif param == '' then
                    return doPlayerSendCancel(cid, 'Command param required (say: "!fire join" or "!fire leave.").')
                elseif getPlayerLevel(cid) < configFireStormEvent.players.minLevel then
                    return doPlayerSendCancel(cid, 'You can\'t join to the event if you don\'t have a require '..configFireStormEvent.players.minLevel..' level.')
                elseif getTileInfo(getThingPos(cid)).protection ~= true then
                    return doPlayerSendCancel(cid, 'You can\'t join to the event if you aren\'t in protection zone.')
                elseif exhaustion.check(cid, configFireStormEvent.storages.exhaust) ~= false then
                    return doPlayerSendCancel(cid, 'You must wait '..exhaustion.get(cid, configFireStormEvent.storages.exhaust)..' seconds to use this command again.')
                end

                if param == 'join' then
                    if getCreatureStorage(cid, configFireStormEvent.storages.player) > 0 then
                        return doPlayerSendCancel(cid, 'You have arleady joined to event. Wait patiently for start.')
                    elseif doCountPlayersFireStormEvent() == configFireStormEvent.players.max then
                        return doPlayerSendCancel(cid, 'Max players in the event have been reached.')
                    end
                 
                    doCreatureSetNoMove(cid, true)
                    doPlayerPopupFYI(cid, configFireStormEvent.text)
                    doCreatureSetStorage(cid, configFireStormEvent.storages.player, 1)
                    doAddCondition(cid, fight)
                    doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, 'You have joined to Fire Storm Event. You can\'t move until event start. Wait patiently for the event start.')
                    doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'You have joined to Fire Storm Event.')
                elseif param == 'leave' then
                    if getCreatureStorage(cid, configFireStormEvent.storages.player) <= 0 then
                        return doPlayerSendCancel(cid, 'You can\'t leave from the event if you don\'t join.')
                    end
                 
                    doCreatureSetNoMove(cid, false)
                    doRemoveCondition(cid, CONDITION_INFIGHT)
                    doCreatureSetStorage(cid, configFireStormEvent.storages.player, -1)
                    doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'You have left from the Fire Storm Event.')
                end
             
                exhaustion.set(cid, configFireStormEvent.storages.exhaust, 5)
             
                return true
            end
        ]]>
    </talkaction>
 
    <talkaction words="!startfire" access="5" event="script">
        <![CDATA[
            domodlib("config_fire_storm_event")
            domodlib("lib_fire_storm_event")

            function onSay(cid, words, param)
                if getStorage(configFireStormEvent.storages.main) > 0 then
                    return doPlayerSendCancel(cid, 'Fire Storm Event is already running.')
                end
         
                doStartCountingFireStormEvent(0)
             
                for _, pid in ipairs(getPlayersOnline()) do
                    if getCreatureStorage(pid, configFireStormEvent.storages.player) > 0 then
                        doCreatureSetStorage(pid, configFireStormEvent.storages.player, -1)
                        doTeleportThing(pid, getTownTemplePosition(getPlayerTown(pid)), true)
                    end
                end
             
                doSetStorage(configFireStormEvent.storages.joining, 1)
                addEvent(doStartFireStormEvent, configFireStormEvent.delayTime * 60 * 1000)
                return true
            end
        ]]>
    </talkaction>

    <globalevent name="Fire_Storm_Event_Days" interval="1000" event="script">
        <![CDATA[
            domodlib("config_fire_storm_event")
            domodlib("lib_fire_storm_event")

            local daysOpen = {}         
            for k, v in pairs(configFireStormEvent.days) do
                table.insert(daysOpen, k)
            end
         
            function onThink(interval)
                if isInArray(daysOpen, os.date('%A')) then
                    if isInArray(configFireStormEvent.days[os.date('%A')], os.date('%X', os.time())) then
                        if getStorage(configFireStormEvent.storages.joining) ~= 1 then
                            doStartCountingFireStormEvent(0)
                         
                            for _, pid in ipairs(getPlayersOnline()) do
                                if getCreatureStorage(pid, configFireStormEvent.storages.player) > 0 then
                                    doCreatureSetStorage(pid, configFireStormEvent.storages.player, -1)
                                    doTeleportThing(pid, getTownTemplePosition(getPlayerTown(pid)), true)
                                end
                            end
                         
                            doSetStorage(configFireStormEvent.storages.joining, 1)
                            addEvent(doStartFireStormEvent, configFireStormEvent.delayTime * 60 * 1000)
                        end
                    end
                end
                return true
            end
        ]]>
    </globalevent>

    <event type="statschange" name="Fire_Storm_Event_Dead" event="script">
        <![CDATA[
            domodlib("config_fire_storm_event")

            function onStatsChange(cid, attacker, type, combat, value)
                if type == 1 and getCreatureHealth(cid) <= value then
                    if isInRange(getThingPos(cid), configFireStormEvent.room.from, configFireStormEvent.room.to) then
                        doCreatureAddHealth(cid, getCreatureMaxHealth(cid) - getCreatureHealth(cid))
                        doCreatureAddMana(cid, getCreatureMaxMana(cid) - getCreatureMana(cid))
                        doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
                        doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'You loss.')
                        return false
                    end
                end
                return true
            end
        ]]>
    </event>
 
    <event type="login" name="Fire_Storm_Event_Login" event="script">
        <![CDATA[
            domodlib("config_fire_storm_event")
     
            function onLogin(cid)
                if getCreatureStorage(cid, configFireStormEvent.storages.player) > 0 then
                    doCreatureSetStorage(cid, configFireStormEvent.storages.player, -1)
                    doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), true)
                    doCreatureSetNoMove(cid, false)
                    doRemoveCondition(cid, CONDITION_INFIGHT)
                end

                registerCreatureEvent(cid, 'Fire_Storm_Event_Dead')
                return true
            end
        ]]>
    </event>
 
    <globalevent name="Fire_Storm_Event_Start" type="startup" event="script">
        <![CDATA[
            domodlib("config_fire_storm_event")

            function onStartup()
                doSetStorage(configFireStormEvent.storages.main, -1)
                doSetStorage(configFireStormEvent.storages.joining, -1)
                return true
            end
        ]]>
    </globalevent>
</mod>
Thank you! everything working... almost just getting this error when reward is recieved
Code:
mysql_real_query(): INSERT INTO `events` (`event_name`, `winner_name`, `won_item
`, `time_win`) VALUES ("Fire", "Driss", "backpack of holding", -1); - MYSQL ERRO
R: Table 'test.events' doesn't exist (1146)
 
Try to go to the database and execute this query:

Code:
DROP TABLE IF EXISTS `events`;
CREATE TABLE IF NOT EXISTS `events` (
  `event_name` varchar(255) NOT NULL,
  `winner_name` varchar(255) NOT NULL,
  `won_item` varchar(255) NOT NULL,
  `time_win` bigint(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Not sure about the time, if they use timestamp or datetime possibly.

Ignazio
 
Try to go to the database and execute this query:

Code:
DROP TABLE IF EXISTS `events`;
CREATE TABLE IF NOT EXISTS `events` (
  `event_name` varchar(255) NOT NULL,
  `winner_name` varchar(255) NOT NULL,
  `won_item` varchar(255) NOT NULL,
  `time_win` bigint(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Not sure about the time, if they use timestamp or datetime possibly.

Ignazio
Thank you very much, both of you! SOLVED
 
Back
Top