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

Fire Storm Event TFS 1.2

Szmugross

Member
Joined
Nov 25, 2012
Messages
5
Reaction score
6
Works Perfect!

Create in data/lib folder events and after inside this folder create firestorm_event.lua and add :
Lua:
-- FIRESTORM EVENT TFS 1.2
            configFireStormEvent = {
                storages = {
                    main = 15000, -- set free storage
                    player = 15001, -- set free storage
                    joining = 15002, -- set free storage
                    exhaust = 15003, -- set free storage
                    countEvent = 15004 -- set free storage
                },
               
                position = Position{x=990 ,y=996,z=7}, -- posiotion to which player is teleporting
                room = {
                    from = {x=984,y=989,z=7}, -- left top corner of event room
                    to = {x=990,y=1011,z=7} -- right bottom corner of event room
                },

                rewards = {8858, 2346, 2538, 2437}, -- reward id which player can win (reward is random)
                players = {
                    max = 3,
                    min = 1,
                    minLevel = 1
                },

                days = {
                    ['Wednesday'] = {'22:14:25'},
                },

                fireStormDelay = 1000, -- milisecond
               
                delayTime = 5.0, -- time in which players who joined to event are teleporting to teleport position
                startEvent = 5, -- time from teleport to start event
                text = "-PL-\nAby wygrac i otrzymac nagrode, utrzymaj sie jak najdluzej na arenie.\n\n-ENG-\nTo win and get a Rewards, to stay as long as possible in the arena."
            }


           
            y, x = 1, 1

           
            function doStartCountingFireStormEvent(x)
                if configFireStormEvent.delayTime-x > 0 then
                    for _, player in ipairs(Game.getPlayers()) do
                        player:sendTextMessage(19, 'Fire Storm Event will start in '..configFireStormEvent.delayTime-x..' minutes. You can join to the event by say "!fire join".')
                    end
                    addEvent(doStartCountingFireStormEvent, 60*1000, x+1)
                end
            end
           
           
            function doCountPlayersFireStormEvent()
                local x = 0
                for _, player in ipairs(Game.getPlayers()) do
                    if player:getStorageValue(configFireStormEvent.storages.player) > 0 then
                        x = x + 1
                    end
                end
                return x
            end
           
            function doStartFireStormEvent()
                Game.setStorageValue(configFireStormEvent.storages.joining, -1)
               
                if configFireStormEvent.players.min <= doCountPlayersFireStormEvent() then       
                    for _, player in ipairs(Game.getPlayers()) do
                       if player:getStorageValue(configFireStormEvent.storages.player) > 0 then
                            player:setMoveLocked(false)
                            player:teleportTo(configFireStormEvent.position)
                            player:setStorageValue(configFireStormEvent.storages.player, -1)
                           
                            player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'Get ready. Fire Storm Event start in '..configFireStormEvent.startEvent..' seconds.')
                        end
                    end
                   
                    addEvent(Game.setStorageValue, configFireStormEvent.startEvent * 1000, configFireStormEvent.storages.main, 1)
                    addEvent(doRepeatCheckFireStorm, configFireStormEvent.startEvent * 1000 + 2000)
                    for _, player in ipairs(Game.getPlayers()) do
                        player:sendTextMessage(19, 'Fire Storm Event has started. LET\'S GO!')
                    end
                else
                    for _, player in ipairs(Game.getPlayers()) do
                        if player:getStorageValue(configFireStormEvent.storages.player) > 0 then
                            player:setMoveLocked(false)
                        end
                    end
                    for _, player in ipairs(Game.getPlayers()) do
                        player:sendTextMessage(19, 'Fire Storm hasn\'t started beacuse there were not enough players.')
                    end
                end
            end
           
       
           
            function doRepeatCheckFireStorm()
                if Game.getStorageValue(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 ' .. getItemName(configFireStormEvent.rewards[prize]) .. ' as reward.')
                        for _, player in ipairs(Game.getPlayers()) do
                            player:sendTextMessage(19, 'Fire Storm has finished. The winner is ' .. getCreatureName(playerTable[1]) .. '. Congratulations.')
                        end
                        Game.setStorageValue(configFireStormEvent.storages.main, -1)
                       
                        db.query("INSERT INTO `events` (`event_name`, `winner_name`, `won_item`, `time_win`) VALUES (\"Fire\", \"" .. getCreatureName(playerTable[1]) .. "\", \"" .. getItemName(configFireStormEvent.rewards[prize]) .. "\", " .. Game.getStorageValue(configFireStormEvent.storages.countEvent) ..");")
                        Game.setStorageValue(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
                        for _, player in ipairs(Game.getPlayers()) do
                            player:sendTextMessage(19, 'No one have won in Fire Storm Event.')
                        end
                        Game.setStorageValue(configFireStormEvent.storages.main, -1)                       
                        Game.setStorageValue(configFireStormEvent.storages.countEvent, getStorage(configFireStormEvent.storages.countEvent) + 1)
                        x, y = 1, 1
                    end
                   
                    addEvent(doRepeatCheckFireStorm, configFireStormEvent.fireStormDelay)
                end
            end

in data/creaturescripts/creaturescripts.xml add
Lua:
    <event type="logout" name="FireStormLogout" script="firestorm_logout.lua" />
    <event type="login" name="FireStormLogin" script="firestorm_login.lua" />
    <event type="preparedeath" name="FireStormStats" script="firestorm_statschange.lua" />

in data/creaturescripts/scripts/firestorm_logout.lua add
Lua:
dofile('data/lib/events/firestorm_event.lua')
function onLogout(player)
    if player:getStorageValue(configFireStormEvent.storages.player) > 0 then
        player:sendCancelMessage('You cant logout after you join Fire Storm Event!')
        return false
    end
return true
end
in data/creaturescripts/scripts/firestorm_login.lua add
Lua:
dofile('data/lib/events/firestorm_event.lua')
function onLogin(player)
if player:getStorageValue(configFireStormEvent.storages.player) > 0 then
    player:setStorageValue(configFireStormEvent.storages.player, -1)
    player:teleportTo(player:getTown():getTemplePosition())
    player:setMoveLocked(false)
end
return true
end
in data/creaturescripts/scripts/firestorm_statschange.lua add
Lua:
dofile('data/lib/events/firestorm_event.lua')
function onPrepareDeath(creature, killer)
if isInRange(getThingPos(creature), configFireStormEvent.room.from, configFireStormEvent.room.to) then
    creature:addHealth(creature:getMaxHealth())
    doCreatureAddMana(creature, getCreatureMaxMana(creature) - getCreatureMana(creature))
    creature:teleportTo(creature:getTown():getTemplePosition())
    creature:sendTextMessage(MESSAGE_EVENT_ORANGE, 'You loss.')
    return false
end
return true
end
in data/creaturescripts/scripts/login.lua add
Lua:
    player:registerEvent("FireStormLogout")
    player:registerEvent("FireStormLogin")
    player:registerEvent("FireStormStats")
in data/globalevents/globalevents.xml add
Lua:
<globalevent type="startup" name="FireStormStartup" script="firestorm_startup.lua" />
<globalevent name="FireStormDays" interval="1000" script="firestorm_days.lua" />
in data/globalevents/scripts/firestorm_startup.lua add
Lua:
dofile('data/lib/events/firestorm_event.lua')
function onStartup()
    Game.setStorageValue(configFireStormEvent.storages.main, -1)
    Game.setStorageValue(configFireStormEvent.storages.joining, -1)
return true
end
in data/globalevents/scripts/firestorm_days.lua add
Lua:
dofile('data/lib/events/firestorm_event.lua')
local daysOpen = {}         
for k, v in pairs(configFireStormEvent.days) do
    table.insert(daysOpen, k)
end
function onThink(interval, lastExecution)
if isInArray(daysOpen, os.date('%A')) then
    if isInArray(configFireStormEvent.days[os.date('%A')], os.date('%X', os.time())) then
        if Game.getStorageValue(configFireStormEvent.storages.joining) ~= 1 then
            doStartCountingFireStormEvent(0)
            for _, player in ipairs(Game.getPlayers()) do
                 if player:getStorageValue(configFireStormEvent.storages.player) > 0 then
                    player:setStorageValue(configFireStormEvent.storages.player, -1)
                    player:teleportTo(player:getTown():getTemplePosition())
                end
            end
            Game.setStorageValue(configFireStormEvent.storages.joining, 1)
            addEvent(doStartFireStormEvent, configFireStormEvent.delayTime * 60 * 1000)
        end
    end
end
return true
end
in data/talkactions/talkactions.xml add
Lua:
<talkaction words="!startfire" script="firestorm_admin.lua" />
<talkaction words="!fire" separator=" " script="firestorm_start.lua" />
in data/talkactions/scripts/firestorm_admin.lua add
Lua:
dofile('data/lib/events/firestorm_event.lua')
function onSay(player, words, param)
    if not player:getGroup():getAccess() then
        return true
    end
   
    if Game.getStorageValue(configFireStormEvent.storages.main) > 0 then
        player:sendCancelMessage('Fire Storm Event is already running.')
        return false
    end
    doStartCountingFireStormEvent(0)
        for _, player in ipairs(Game.getPlayers()) do
             if player:getStorageValue(configFireStormEvent.storages.player) > 0 then
                player:setStorageValue(configFireStormEvent.storages.player, -1)
                player:teleportTo(player:getTown():getTemplePosition())
            end
        end
    Game.setStorageValue(configFireStormEvent.storages.joining, 1)
    addEvent(doStartFireStormEvent, configFireStormEvent.delayTime * 60 * 1000)
return false
end
in data/talkactions/scripts/firestorm_start.lua add
Lua:
  dofile('data/lib/events/firestorm_event.lua')
function onSay(player, words, param)   
if Game.getStorageValue(configFireStormEvent.storages.joining) ~= 1 then
    player:sendCancelMessage('Fire Storm Event hasn\'t started yet.')
    return false
elseif param == '' then
    player:sendCancelMessage('Command param required (say: "!fire join" or "!fire leave.").')
    return false
elseif player:getLevel() < configFireStormEvent.players.minLevel then
    player:sendCancelMessage('You can\'t join to the event if you don\'t have a require '..configFireStormEvent.players.minLevel..' level.')
    return false
elseif getTileInfo(player:getPosition()).protection ~= true then
    player:sendCancelMessage('You can\'t join to the event if you aren\'t in protection zone.')
    return false
elseif player.getExhaustion(player, configFireStormEvent.storages.exhaust) > 0 then
    player:sendCancelMessage('You must wait '..player.getExhaustion(player, configFireStormEvent.storages.exhaust)..' seconds to use this command again.')
    return false
end

if param == 'join' then
    if player:getStorageValue(configFireStormEvent.storages.player) > 0 then
        player:sendCancelMessage('You have arleady joined to event. Wait patiently for start.')
    return false
    elseif doCountPlayersFireStormEvent() == configFireStormEvent.players.max then
        player:sendCancelMessage('Max players in the event have been reached.')
    return false
    end

    player:setMoveLocked(player, true)
    player:popupFYI(configFireStormEvent.text)
    player:setStorageValue(configFireStormEvent.storages.player, 1)
    player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'You have joined to Fire Storm Event. You can\'t move until event don\'t start. Wait patiently for the event start.')
    player:sendTextMessage(MESSAGE_EVENT_ORANGE, 'You have joined to Fire Storm Event.')
elseif param == 'leave' then
    if player:getStorageValue(configFireStormEvent.storages.player) == 1 then
        player:setMoveLocked(false)
        player:setStorageValue(configFireStormEvent.storages.player, -1)
        player:sendTextMessage(MESSAGE_EVENT_ORANGE, 'You have left from the Fire Storm Event.')
    else
        player:sendCancelMessage('Command param required (say: "!fire join").')
        return false
    end
   
end
    player.setExhaustion(player, configFireStormEvent.storages.exhaust,5)
    return false
end
 
inside data/lib/compat/compad.lua add
Code:
function getPlayerMana(cid) local p = Player(cid) return p ~= nil and p:getMana() or false end
function getPlayerMaxMana(cid) local p = Player(cid) return p ~= nil and p:getMaxMana() or false end
function doCreatureAddMana(cid, mana) local c = Creature(cid) return c ~= nil and c:addMana(mana) or false end
 
Lua Script Error: [TalkAction Interface]
data/talkactions/scripts/firestorm_start.lua:eek:nSay
data/talkactions/scripts/firestorm_start.lua:29: attempt to call method 'setMoveLocked' (a nil value)
stack traceback:
[C]: in function 'setMoveLocked'
data/talkactions/scripts/firestorm_start.lua:29: in function <data/talkactions/scripts/firestorm_start.lua:2>

Help please!! after start, players cant enter in event using !fire join
 
Back
Top