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

(MOD) Fire Storm Event

kozmo

Member
Joined
Jan 30, 2009
Messages
443
Solutions
2
Reaction score
23
I had this mod working fine in my 9.1 server , i switched and started working on a 8.6 server i just recently tried adding this event/mod in and it all seems to work fine accept after it says Get ready, The Event will start in 30 seconds... 30 seconds later the fire does not even start dropping so i have no clue why this wouldn't be working, If anyone knows why this is not working or what i have to edit in the script to fix it that would help a lot.

XML:
<?xml version="1.0" encoding="UTF-8"?>
<mod name="Fire Storm Event" version="1.0" author="iFate" contact="otland.net/members/iFate/" enabled="yes">

    <config name="lms_config">
        <![CDATA[
            configFire = {
                storage = 8998, -- set free storage
                eventStorage = 6254, -- set free storage
                joinEventStorage = 5535, -- set free storage
                countPlayerStorage = 7373, -- set free storage
                exhaustStorage = 8387,

                maxPlayers = 50, -- max players in event
                teleportPos = {x=1110 ,y=1174,z=7}, -- position to which player is teleporting
                rewardID = {9693},  -- reward id which player can win (reward is random)
                minLevel = 1, -- minimum of level with which player can join to event
                days = {
                    ['Monday'] = {'18:00:00'},
                    ['Tuesday'] = {'18:00:00'}, 
                    ['Wednesday'] = {'18:00:00'},
                    ['Thursday'] = {'18:00:00'}, 
                    ['Friday'] = {'18:00:00'},
                    ['Saturday'] = {'18:00:00'},
                    ['Sunday'] = {'18:00:00'}
                },
                minPlayers = 2,

                delayTime = 3.0, -- time in which players who joined to event are teleporting to teleport position
                timeToStartEvent = 30 -- time from teleport to start event
            }

            arena = {fromPos = {x=1090,y=1165,z=7}, -- left top corner of event room
                    toPos = {x=1132,y=1182,z=7} -- right bottom corner of event room
            }
            
            y, x = 1, 1
        ]]>
    </config>
    
    <lib name="lms_fire_lib">
        <![CDATA[
            function doStartEvent()
                doSetStorage(configFire.joinEventStorage, -1)
                
                if configFire.minPlayers <= getStorage(configFire.countPlayerStorage) + 1 then        
                    for _, cid in ipairs(getPlayersOnline()) do
                        if getCreatureStorage(cid, configFire.storage) == 1 then
                            addEvent(doSetStorage, configFire.timeToStartEvent * 1000, configFire.eventStorage, 1)
                            doCreatureSetStorage(cid, configFire.storage, -1)
                            doCreatureSetNoMove(cid, false)
                            doRemoveCondition(cid, CONDITION_INFIGHT)

                            doTeleportThing(cid, configFire.teleportPos)

                            doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, 'Get ready, The Event will start in ' .. configFire.timeToStartEvent .. ' seconds.')
                        end
                    end
                else
                    for _, cid in ipairs(getPlayersOnline()) do
                        if getCreatureStorage(cid, configFire.storage) == 1 then
                            doCreatureSetNoMove(cid, false)
                            doRemoveCondition(cid, CONDITION_INFIGHT)
                        end
                    end
                    doBroadcastMessage('The fire storm event has not started because not enough players joined.', MESSAGE_EVENT_ADVANCE)
                end
                
                doSetStorage(configFire.countPlayerStorage, 0)
            end
        ]]>
    </lib>

    <talkaction words="!event" event="script">
        <![CDATA[
            domodlib("lms_config")

            function onSay(cid, words, param)
                local storage, playerJoined, counter = getCreatureStorage(cid, configFire.storage), {}, getStorage(configFire.countPlayerStorage)

                if getStorage(configFire.joinEventStorage) == 1 then
                    if(param == '') then
                        return doPlayerSendTextMessage(cid, MESSAGE_STATUS_SMALL, 'Command param required (say: "!event join" or "!event leave").')
                    end
                    
                    if configFire.minLevel ~= nil then
                        if getPlayerLevel(cid) < configFire.minLevel then
                            return doPlayerSendTextMessage(cid, MESSAGE_STATUS_SMALL, 'You cannot join The Fire Storm Event if you do not have a require level. [' .. configFire.minLevel .. ']')
                        end
                    end
                    
                    if getTileInfo(getThingPos(cid)).protection ~= true then
                        return doPlayerSendTextMessage(cid, MESSAGE_STATUS_SMALL, 'You cannot join The Fire Storm Event if you are not in a Protection Zone.')
                    end
                    
                    if exhaustion.check(cid, configFire.exhaustStorage) ~= false then
                        return doPlayerSendTextMessage(cid, MESSAGE_STATUS_SMALL, 'You must wait' .. exhaustion.get(cid, configFire.exhaustStorage) .. ' seconds.')
                    end

                    if param == 'join' then
                        if storage <= 0 then
                            if counter ~= configFire.maxPlayers - 1 then
                                doSetStorage(configFire.countPlayerStorage, 0)
                                for _, pid in ipairs(getPlayersOnline()) do
                                    if getCreatureStorage(pid, configFire.storage) > 0 then
                                        table.insert(playerJoined, pid)
                                        doSetStorage(configFire.countPlayerStorage, #playerJoined)
                                    end
                                end
                                local count = getStorage(configFire.countPlayerStorage)
                                doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, count == 0 and 'You are first in the fire storm event.' or count == 1 and 'There is 1 player in fire storm event.' or count > 1 and 'There are '.. count ..' players in fire storm event.')
                                doCreatureSetStorage(cid, configFire.storage, 1)
                                
                                doCreatureSetNoMove(cid, true)
                                local condition = createConditionObject(CONDITION_INFIGHT,-1)
                                
                                doAddCondition(cid, condition)
                                doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, 'You have joined the Fire Storm Event, You may not move until the Event has started please wait patiently...')
                            else
                                doPlayerSendTextMessage(cid, MESSAGE_STATUS_SMALL, 'Max players in event have been reached.')
                            end
                        else
                            doPlayerSendTextMessage(cid, MESSAGE_STATUS_SMALL, 'You already joined the Event, Wait patiently for it to start.')
                        end
                    elseif param == 'leave' then
                        if storage > 0 then
                            doCreatureSetNoMove(cid, false)
                            doRemoveCondition(cid, CONDITION_INFIGHT)
                            doCreatureSetStorage(cid, configFire.storage, -1)
                            doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'You have left the Fire Run Event, And you can move now.')
                        else
                            doPlayerSendTextMessage(cid, MESSAGE_STATUS_SMALL, 'You cannot leave The Fire Storm Event.')
                        end
                    end
                else
                    doPlayerSendTextMessage(cid, MESSAGE_STATUS_SMALL, 'You cannot join/leave The Fire Storm Event yet.')
                end
                
                exhaustion.set(cid, configFire.exhaustStorage, 5)
                
                return true
            end
        ]]>
    </talkaction>
    
    <talkaction words="!startfire" access="5" event="script">
        <![CDATA[
            domodlib("lms_config")
            domodlib("lms_fire_lib")

            function onSay(cid, words, param)
                doBroadcastMessage('Fire Storm Event will start in ' .. configFire.delayTime .. ' minutes. You can join the Fire Storm Event by using this command "!event join".', MESSAGE_EVENT_ADVANCE)

                for _, pid in ipairs(getPlayersOnline()) do
                    if getCreatureStorage(pid, configFire.storage) == 1 then
                        doCreatureSetStorage(pid, configFire.storage, -1)
                        doSetStorage(configFire.countPlayerStorage, 0)
                        doTeleportThing(pid, getTownTemplePosition(getPlayerTown(pid)), true)
                    end
                end

                doSetStorage(configFire.joinEventStorage, 1)        
                addEvent(doStartEvent, configFire.delayTime * 60 * 1000)
                return true
            end
        ]]>
    </talkaction>

    <event type="think" name="LMS_Event_Start" event="script">
        <![CDATA[
            domodlib("lms_config")
            domodlib("lms_fire_lib")

            local daysOpen = {}
            
            for k, v in pairs(configFire.days) do
                table.insert(daysOpen, k)
            end
            
            function onThink(cid, interval)
                if isInArray(daysOpen, os.date('%A')) then
                    if isInArray(configFire.days[os.date('%A')], os.date('%X', os.time())) then
                        if getStorage(configFire.joinEventStorage) ~= 1 then
                            doBroadcastMessage('Fire Storm Event will start in '.. configFire.delayTime ..' minutes. You can join the event by typing "!event join".', MESSAGE_EVENT_ADVANCE)

                            for _, pid in ipairs(getPlayersOnline()) do
                                if getCreatureStorage(pid, configFire.storage) == 1 then
                                    doCreatureSetStorage(pid, configFire.storage, -1)
                                    doSetStorage(configFire.countPlayerStorage, 0)
                                    doTeleportThing(pid, getTownTemplePosition(getPlayerTown(pid)), true)
                                end
                            end

                            doSetStorage(configFire.joinEventStorage, 1)        
                            addEvent(doStartEvent, configFire.delayTime * 60 * 1000)
                        end
                    end
                end
                return true
            end
        ]]>
    </event>
    
    <globalevent name="LMS_Event" interval="1000" event="script">
        <![CDATA[
            domodlib("lms_config")

            function onThink(interval, lastExecution)
                if getStorage(configFire.eventStorage) == 1 then
                    local xTable, yTable, playerTable = {}, {}, {}

                    for x = arena.fromPos.x, arena.toPos.x do
                        for y = arena.fromPos.y, arena.toPos.y do
                            table.insert(xTable, x)
                            table.insert(yTable, y)

                            local n, i = getTileInfo({x=x, y=y, z=7}).creatures, 1
                            if n ~= 0 then
                                local v = getThingfromPos({x=x, y=y, z=7, 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=7, stackpos=i}).uid
                                end
                            end
                        end
                    end

                    if #playerTable == 1 then
                        local prize = math.random(#configFire.rewardID)

                        doTeleportThing(playerTable[1], getTownTemplePosition(getPlayerTown(playerTable[1])), true)
                        doPlayerAddItem(playerTable[1], configFire.rewardID[prize], 1)
                        doPlayerSendTextMessage(playerTable[1], MESSAGE_EVENT_ADVANCE, 'You win. Your reward is ' .. getItemNameById(configFire.rewardID[prize]) .. '.')
                        doBroadcastMessage('Fire Storm Event have finished. The winner is ' .. getCreatureName(playerTable[1]) .. '. Congratulations.', MESSAGE_EVENT_ADVANCE)
                        doSetStorage(configFire.eventStorage, -1)
                        
                        x, y = 1, 1
                    elseif #playerTable > 1 then
                        for a = 1, y do
                            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
                        if x == 5 * y then
                            y = y + 1
                        end
                        
                        x = x + 1
                    else
                        doBroadcastMessage('No one Won the Fire Storm Event.', MESSAGE_EVENT_ADVANCE)
                        doSetStorage(configFire.eventStorage, -1)
                        x, y = 1, 1
                    end
                end            
                return true
            end
        ]]>
    </globalevent>

    <event type="login" name="LMS_Fire_login" event="script">
        <![CDATA[
            function onLogin(cid)
                if getCreatureStorage(cid, configFire.storage) == 1 then
                    doCreatureSetStorage(cid, configFire.storage, -1)
                    doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), true)
                    doCreatureSetNoMove(cid, false)
                    doRemoveCondition(cid, CONDITION_INFIGHT)
                end

                registerCreatureEvent(cid, "LMS_fire_dead")
                registerCreatureEvent(cid, "LMS_Event_Start")
                return true
            end
        ]]>
    </event>

    <event type="statschange" name="LMS_fire_dead" event="script">
        <![CDATA[
            domodlib("lms_config")

            function onStatsChange(cid, attacker, type, combat, value)
                if type == 1 and getCreatureHealth(cid) <= value then
                    if isInRange(getThingPos(cid), arena.fromPos, arena.toPos) then
                        doCreatureAddHealth(cid, - getCreatureHealth(cid) + 1)
                        doCreatureAddMana(cid, - getCreatureMana(cid))
                        doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
                        doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, 'You have lost the Fire Storm Event.')
                        return false
                    end
                end
                return true
            end
        ]]>
    </event>
</mod>
 
Last edited by a moderator:
not work :/ heeelp tis script of event is nice :/


[Error - CreatureScript Interface]
[01/08/2013 15:15:10] buffer:eek:nStatsChange
[01/08/2013 15:15:10] Description:
[01/08/2013 15:15:10] data/lib/032-position.lua:2: attempt to index global 'position' (a nil value)
[01/08/2013 15:15:10] stack traceback:
[01/08/2013 15:15:10] data/lib/032-position.lua:2: in function 'isInRange'
[01/08/2013 15:15:10] [string "loadBuffer"]:5: in function <[string "loadBuffer"]:3>
 
Last edited:
i want put in reward 50 crystal coins ... who can i do this? i put in rewardID = {2160}, but winner won just 1 crystal .. help me please

ty
 
Code:
doPlayerAddItem(playerTable[1], configFire.rewardID[prize], 1)
The function works like this.
Code:
doPlayerAddItem(cid, itemid, count)
So you can change the 1 at the end to 50.
 
Thanks a lot!


Code:
['Monday'] = {'00:00:00'},
['Monday'] = {'04:00:00'},
['Monday'] = {'08:00:00'},
['Monday'] = {'12:00:00'},
['Monday'] = {'16:00:00'},
['Monday'] = {'20:00:00'},
['Tuesday'] = {'00:00:00'},
['Tuesday'] = {'04:00:00'},
['Tuesday'] = {'08:00:00'},
['Tuesday'] = {'12:00:00'},
['Tuesday'] = {'16:00:00'},
['Tuesday'] = {'20:00:00'},
['Wednesday'] = {'00:00:00'},
['Wednesday'] = {'04:00:00'},
['Wednesday'] = {'08:00:00'},
['Wednesday'] = {'12:00:00'},
['Wednesday'] = {'16:00:00'},
['Wednesday'] = {'20:00:00'},
['Thursday'] = {'00:00:00'},
['Thursday'] = {'04:00:00'},
['Thursday'] = {'08:00:00'},
['Thursday'] = {'12:00:00'},
['Thursday'] = {'16:00:00'},
['Thursday'] = {'20:00:00'},
['Friday'] = {'00:00:00'},
['Friday'] = {'04:00:00'},
['Friday'] = {'08:00:00'},
['Friday'] = {'12:00:00'},
['Friday'] = {'16:00:00'},
['Friday'] = {'20:00:00'},
['Saturday'] = {'00:00:00'},
['Saturday'] = {'04:00:00'},
['Saturday'] = {'08:00:00'},
['Saturday'] = {'12:00:00'},
['Saturday'] = {'16:00:00'},
['Saturday'] = {'20:00:00'},
['Sunday'] = {'00:00:00'},
['Sunday'] = {'04:00:00'},
['Sunday'] = {'08:00:00'},
['Sunday'] = {'12:00:00'},
['Sunday'] = {'16:00:00'},
['Sunday'] = {'20:00:00'}
},

i have this, but event dont start ... i think that this event junt can start 1 time in a day, but i wanted the event begins of 4 in 4 hours, how can i do this?
 
replace for this
Code:
function isInRange(position, fromPosition, toPosition)
  return (position.x >= fromPosition.x and position.y >= fromPosition.y and position.z >= fromPosition.z
      and position.x <= toPosition.x and position.y <= toPosition.y and position.z <= toPosition.z)
end

function getDistanceBetween(fromPosition, toPosition)
  local x, y = math.abs(fromPosition.x - toPosition.x), math.abs(fromPosition.y - toPosition.y)
  local diff = math.max(x, y)
  if(fromPosition.z ~= toPosition.z) then
      diff = diff + 9 + 6
  end

  return diff
end

function getDirectionTo(pos1, pos2)
  local dir = SOUTH
  if(pos1.x > pos2.x) then
      dir = WEST
      if(pos1.y > pos2.y) then
        dir = NORTHWEST
      elseif(pos1.y < pos2.y) then
        dir = SOUTHWEST
      end
  elseif(pos1.x < pos2.x) then
      dir = EAST
      if(pos1.y > pos2.y) then
        dir = NORTHEAST
      elseif(pos1.y < pos2.y) then
        dir = SOUTHEAST
      end
  elseif(pos1.y > pos2.y) then
      dir = NORTH
  elseif(pos1.y < pos2.y) then
      dir = SOUTH
  end

  return dir
end

function getCreatureLookPosition(cid)
  return getPositionByDirection(getThingPosition(cid), getCreatureLookDirection(cid))
end

function getPositionByDirection(position, direction, size)
  local n = size or 1
  if(direction == NORTH) then
      position.y = position.y - n
  elseif(direction == SOUTH) then
      position.y = position.y + n
  elseif(direction == WEST) then
      position.x = position.x - n
  elseif(direction == EAST) then
      position.x = position.x + n
  elseif(direction == NORTHWEST) then
      position.y = position.y - n
      position.x = position.x - n
  elseif(direction == NORTHEAST) then
      position.y = position.y - n
      position.x = position.x + n
  elseif(direction == SOUTHWEST) then
      position.y = position.y + n
      position.x = position.x - n
  elseif(direction == SOUTHEAST) then
      position.y = position.y + n
      position.x = position.x + n
  end

  return position
end

function doComparePositions(position, positionEx)
  return position.x == positionEx.x and position.y == positionEx.y and position.z == positionEx.z
end

function getArea(position, x, y)
  local t = {}
  for i = (position.x - x), (position.x + x) do
      for j = (position.y - y), (position.y + y) do
        table.insert(t, {x = i, y = j, z = position.z})
      end
  end

  return t
end

function Position(x, y, z, stackpos)
  local position = {x = 0, y = 0, z = 0}
  if(isNumeric(x .. y .. z)) then
      position = {x = x, y = y, z = z}
      if(isNumeric(stackpos)) then
        position.stackpos = stackpos
      end
  end

  return position
end

function isValidPosition(position)
  return (isNumeric(position.x .. position.y .. position.z) and position.x > 0
      and position.y > 0 and position.z >= 0 and position.z <= 15)
end

but create a backup for your file first!
 
this is fire storm event, players enter and when event start, players have to move and scape of the "fire rain" ... last player survive, won!
 
another bug in the player station event begins and when it speaks not hear anyone around winners and get stuck in the temple event my server is 8.60
 
Back
Top