Works Perfect!
Create in data/lib folder events and after inside this folder create firestorm_event.lua and add :
in data/creaturescripts/creaturescripts.xml add
in data/creaturescripts/scripts/firestorm_logout.lua add
in data/creaturescripts/scripts/firestorm_login.lua add
in data/creaturescripts/scripts/firestorm_statschange.lua add
in data/creaturescripts/scripts/login.lua add
in data/globalevents/globalevents.xml add
in data/globalevents/scripts/firestorm_startup.lua add
in data/globalevents/scripts/firestorm_days.lua add
in data/talkactions/talkactions.xml add
in data/talkactions/scripts/firestorm_admin.lua add
in data/talkactions/scripts/firestorm_start.lua add
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
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
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
Lua:
player:registerEvent("FireStormLogout")
player:registerEvent("FireStormLogin")
player:registerEvent("FireStormStats")
Lua:
<globalevent type="startup" name="FireStormStartup" script="firestorm_startup.lua" />
<globalevent name="FireStormDays" interval="1000" script="firestorm_days.lua" />
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
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
Lua:
<talkaction words="!startfire" script="firestorm_admin.lua" />
<talkaction words="!fire" separator=" " script="firestorm_start.lua" />
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
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