Por
Sarah Wesker
>> Only TFS 1.X+ <<
Oi tudo bem, espero que bem.
Hoje, apenas começando o ano novo, quero dar-lhe um Firestorm event que eu criei com muito amor para você.
Atualmente, há muitos eventos semelhantes, mas espero que você dê uma chance ao meu Firestorm event.
Em seguida, vou explicar rapidamente como usar o Firestorm event.
(( Passo 1 ))
Crie um novo arquivo.lua na pasta: ( data/lib/ ) com o nome ( fire_storm.lua )
Copie e cole o código no arquivo fire_storm.lua
--[[
* Fire Storm Event *
Evento creado por Sarah Wesker
Dia 31 de Diciembre del 2018 a las 12:30 a.m.
Version compatible con TFS 1.x+
]]--
local DEBUG_ON = true
local RELOAD_LIB_ON = true
local SHOW_COPYRIGHT = true
if RELOAD_LIB_ON or not FSE then
if not FSE then
print([[>>> The Firestorm Event lib loading...]])
end
---@Fire Storm Event
FSE = {}
---@Room Properties
FSE.room = {}
FSE.room.from = Position(3095, 1847, 8)
FSE.room.rangeX = 33
FSE.room.rangeY = 31
---@Temple Position
FSE.getTemplePosition = Position(3191, 1809, 7)
---@Attack Properties
FSE.attackSignalEffect = CONST_ME_HITBYFIRE
FSE.attackEffect = CONST_ME_FIREAREA
FSE.attackDistEffect = CONST_ANI_FIRE
---@Player Counts
FSE.players = {}
FSE.players.min = 2
FSE.players.max = 30
FSE.players.win = 1 -- always less than FSE.players.min
---@Timers in seconds
FSE.timer = {}
FSE.timer.removeTp = 20
FSE.timer.checking = 2
FSE.timer.signal = {}
FSE.timer.signal.min = 0.1
FSE.timer.signal.max = 0.5
FSE.timer.events = {}
---@Game Dificulty
FSE.dificulty = {}
FSE.dificulty.attacks = 30
FSE.dificulty.increment = 1
FSE.dificulty.D_attacks = FSE.dificulty.attacks
FSE.dificulty.D_increment = FSE.dificulty.increment
---@Teleport Properties
FSE.teleport = {}
FSE.teleport.itemid = 1387
FSE.teleport.position = Position(3187, 1816, 7)
FSE.teleport.destination = Position(3111, 1863, 8)
FSE.teleport.actionid = 64500 -- movement script aid
FSE.status = [[Stoped]]
FSE.rewardContainerName = [[Firestorm Reward]]
FSE.rewardContainerID = 2596
FSE.rewards = {
-- { id = xxxx, count = 1 to 100 }
{ id = 2160, count = 100 },
{ id = 2160, count = 100 }
}
function FSE:removeTp(seconds)
local teleport = FSE.teleport.position:getTile():getItemById(FSE.teleport.itemid)
if teleport then
teleport:remove()
FSE.teleport.position:sendMagicEffect(CONST_ME_POFF)
end
FSE:CheckControl()
end
function FSE:Init()
if FSE.status == [[Stoped]] then
FSE.status = [[Waiting]]
local teleport = Game.createItem(FSE.teleport.itemid, 1, FSE.teleport.position)
if not teleport then
FSE:Stoped()
return DEBUG_ON and print([[The Firestorm Event teleport could not be created.]])
else
teleport:setActionId(FSE.teleport.actionid)
end
addEvent(FSE.removeTp, FSE.timer.removeTp * 1000)
Game.broadcastMessage(string.format([[The Firestorm Event has been activated, waiting for participants, You have %s to enter.]], getStringTimeEnglish(FSE.timer.removeTp)))
else
return DEBUG_ON and print([[The Firestorm Event is trying to start, but an active instance already exists.]])
end
end
function FSE:Stoped(players, causeMessage, forceStoped)
FSE.status = [[Stoped]]
for index, eventID in pairs(FSE.timer.events) do
stopEvent(eventID)
end
FSE.timer.events = {}
for index, player in pairs(players) do
player:teleportTo(FSE.getTemplePosition, false)
end
FSE.getTemplePosition:sendMagicEffect(CONST_ME_TELEPORT)
if forceStoped then
Game.broadcastMessage([[The Firestorm Event was forced to close.]])
elseif causeMessage then
Game.broadcastMessage(causeMessage)
end
FSE.dificulty.attacks = FSE.dificulty.D_attacks
FSE.dificulty.increment = FSE.dificulty.D_increment
return true
end
function FSE:Started(startMessage)
FSE.status = [[Started]]
if startMessage then
Game.broadcastMessage(startMessage)
end
FSE:CheckControl()
end
function FSE:AddEvent(eventID)
table.insert(FSE.timer.events, eventID)
return eventID
end
local function getWinNames(players)
local names = [[]]
for index, player in pairs(players) do
names = string.format([[%s%s%s]], names, player:getName(), next(players, index) == nil and '.' or [[, ]])
end
return names
end
function FSE:CheckControl()
if FSE.status == [[Stoped]] then
-- Break Control
elseif FSE.status == [[Waiting]] then
local players = FSE:GetPlayers()
if #players < FSE.players.min then
FSE:Stoped(players, [[The Firestorm Event could not be started because there are not enough participants.]])
else
FSE:Started()
end
elseif FSE.status == [[Started]] then
local players = FSE:GetPlayers()
if #players <= FSE.players.win then
if #players == 0 then
FSE:Stoped(players, [[The Firestorm Event has ended.]])
else
FSE:Stoped(players, string.format([[The Firestorm Event has ended, the winners are: %s]], getWinNames(players)))
FSE:SendRewardToPlayers(players)
end
FSE:AllRightReserve() -- only credits you can remove if want.
else
for index = 1, FSE.dificulty.attacks do
addEvent(FSE.AttackSignal, math.random(FSE.timer.signal.min * 1000, FSE.timer.signal.max * 1000))
end
FSE.dificulty.attacks = FSE.dificulty.attacks + FSE.dificulty.increment
FSE:AddEvent(addEvent(FSE.CheckControl, FSE.timer.checking * 1000))
end
end
end
function FSE:GetPlayers()
local spectators = Game.getSpectators(FSE.room.from, false, true, 1, FSE.room.rangeX, 1, FSE.room.rangeY)
local players = {}
if spectators and #spectators > 0 then
for index, player in pairs(spectators) do
if not player:getGroup():getAccess() then
players[#players + 1] = player
end
end
end
return players
end
local function getRewardNames(items)
local names = [[]]
for index, item in pairs(items) do
local it = ItemType(item.id)
names = string.format([[%s%u %s%s]], names, item.count, it:getName(), next(items, index) == nil and '.' or [[, ]])
end
return names
end
function FSE:SendRewardToPlayers(players)
for index, player in pairs(players) do
local depotChest = player:getDepotChest(0, true)
if depotChest then
local rewardContainer = Game.createItem(FSE.rewardContainerID, 1)
if rewardContainer then
rewardContainer:setName(FSE.rewardContainerName)
local rewardNames = getRewardNames(FSE.rewards)
for index2, item in pairs(FSE.rewards) do
rewardContainer:addItem(item.id, item.count)
end
if depotChest:addItemEx(rewardContainer, INDEX_WHEREEVER, FLAG_NOLIMIT) then
player:sendTextMessage(MESSAGE_INFO_DESCR, string.format([[You have received on your depot chest: %s]], rewardNames))
end
end
end
end
end
function FSE:GetRandomTile()
local foundTile = Tile(FSE.room.from + Position(math.random(0, FSE.room.rangeX), math.random(0, FSE.room.rangeY), 0))
while not foundTile or not foundTile:getGround() or foundTile:hasProperty(CONST_PROP_BLOCKSOLID) do
foundTile = Tile(FSE.room.from + Position(math.random(0, FSE.room.rangeX), math.random(0, FSE.room.rangeY), 0))
end
return foundTile
end
function FSE:AttackSignal()
local foundTile = FSE:GetRandomTile()
if not foundTile then
return DEBUG_ON and print([[Not tile could be found in the Firestorm Event area.]])
end
local position = foundTile:getPosition()
position:sendMagicEffect(FSE.attackSignalEffect)
return addEvent(FSE.AttackTile, 500, self, { x = position.x, y = position.y, z = position.z })
end
function FSE:AttackTile(tpos)
local position = Position(tpos)
local creatures = position:getTile():getCreatures()
local fromposdist = (position-Position(5, 5, 0))
fromposdist:sendDistanceEffect(position, FSE.attackDistEffect)
position:sendMagicEffect(FSE.attackEffect)
if creatures and #creatures > 0 then
for index, creature in pairs(creatures) do
local player = creature:getPlayer()
if player and not player:getGroup():getAccess() then
position:sendMagicEffect(CONST_ME_POFF)
player:teleportTo(FSE.getTemplePosition, false)
FSE.getTemplePosition:sendMagicEffect(CONST_ME_TELEPORT)
Game.broadcastMessage(string.format([[The player %s has been eliminated from the Firestorm Event.]], player:getName()))
end
end
end
end
function FSE:AllRightReserve()
return SHOW_COPYRIGHT and print([[The Firestorm Event has ended, all rights reserved for Sarah Wesker.]])
end
if type(FSE) == [[table]] then
print([[>>> The Firestorm Event lib has successfully loaded.]])
end
end
(( Passo 2 ))
Abra o arquivo ( data/lib/lib.lua ) e adicione esta linha:
dofile('data/lib/fire_storm.lua')
(( Passo 3 ))
Abra o arquivo ( data/movements/movements.xml ) e adicione esta linha:
<movevent event="StepIn" actionid="64500" script="fire_storm.lua" />
(( Passo 4 ))
Vá para a pasta ( data/movements/scripts ) e crie um novo arquivo.lua ( fire_storm.lua )
Copie e cole o seguinte código nesse novo arquivo.lua
function onStepIn(creature, item, position, fromPosition)
local player = creature:getPlayer()
if player then
if #FSE:GetPlayers() >= FSE.players.max then
player:teleportTo(FSE.getTemplePosition, false)
FSE.getTemplePosition:sendMagicEffect(CONST_ME_TELEPORT)
else
player:teleportTo(FSE.teleport.destination, false)
FSE.teleport.destination:sendMagicEffect(CONST_ME_TELEPORT)
if not player:getGroup():getAccess() then
player:sendTextMessage(MESSAGE_EVENT_ADVANCE, [[Welcome to the Firestorm Event, you have to survive the rain of fire to win.]])
else
player:sendTextMessage(MESSAGE_EVENT_ADVANCE, [[Welcome, administrators can only participate as spectators.]])
end
end
else
creature:teleportTo(fromPosition, false)
end
return true
end
(( Passo 5 ))
Faça o evento começar em um determinado horário!
Você abre o arquivo ( data/globalevents/globalevents.xml ) e adicione esta linha:
<globalevent name="Firestorm Event" time="12:00:00" script="fire_strom.lua" />
(( Passo 6 ))
Crie um novo arquivo.lua dentro da pasta ( data/globalevents/scripts/ ) -> ( fire_storm.lua )
e adicione este código dentro desse arquivo:
function onTime(interval)
FSE:Init()
return true
end
(( The End ))
Aproveite
(( Others ))
FSE:Init() | Para iniciar o evento.
FSE:Stoped() | Para parar o evento.
(( REF IMAGES ))
| https://prnt.sc/m2a6ov |
| https://prnt.sc/m2a6gf |
| https://prnt.sc/m2a7t5 |
Posts Recomendados
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.