Ir para conteúdo

Featured Replies

Postado
  • Este é um post popular.

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

 

  • Respostas 6
  • Visualizações 2k
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • Parabéns, seu tópico de conteúdo foi aprovado! Muito obrigado pela sua contribuição, nós do Tibia King agradecemos. Seu conteúdo com certeza ajudará à muitos outros, você recebeu +1 REP.  

Postado

Parabéns, seu tópico de conteúdo foi aprovado!
Muito obrigado pela sua contribuição, nós do Tibia King agradecemos.
Seu conteúdo com certeza ajudará à muitos outros, você recebeu +1 REP.

Mostrar conteúdo oculto

 

  • 1 year later...
Postado

Olá, eu tenho esses 2 erros

 

Lua Script Error: [GlobalEvent Interface]
data/globalevents/scripts/fire_storm.lua:onTime
data/lib/fire_storm.lua:92: attempt to call global 'getStringTimeEnglish' (a nil value)
stack traceback:
        [C]: in function 'getStringTimeEnglish'
        data/lib/fire_storm.lua:92: in function 'Init'
        data/globalevents/scripts/fire_storm.lua:2: in function <data/globalevents/scripts/fire_storm.lua:1>

Lua Script Error: [Main Interface]
in a timer event called from:
(Unknown scriptfile)
data/lib/fire_storm.lua:197: attempt to call method 'setName' (a nil value)
stack traceback:
        [C]: in function 'setName'
        data/lib/fire_storm.lua:197: in function 'SendRewardToPlayers'
        data/lib/fire_storm.lua:156: in function <data/lib/fire_storm.lua:139>

Senhoras e senhores, se alguma resposta lhe ajudou, marque-a como a melhor resposta e de ponto positivo, assim você incentiva quem lhe ajudou a continuar ajudando!!.

Postado
  Em 03/01/2020 em 01:12, tetheuscunha disse:

Olá, eu tenho esses 2 erros

 

 

Lua Script Error: [GlobalEvent Interface]
data/globalevents/scripts/fire_storm.lua:onTime
data/lib/fire_storm.lua:92: attempt to call global 'getStringTimeEnglish' (a nil value)
stack traceback:
        [C]: in function 'getStringTimeEnglish'
        data/lib/fire_storm.lua:92: in function 'Init'
        data/globalevents/scripts/fire_storm.lua:2: in function <data/globalevents/scripts/fire_storm.lua:1>

Lua Script Error: [Main Interface]
in a timer event called from:
(Unknown scriptfile)
data/lib/fire_storm.lua:197: attempt to call method 'setName' (a nil value)
stack traceback:
        [C]: in function 'setName'
        data/lib/fire_storm.lua:197: in function 'SendRewardToPlayers'
        data/lib/fire_storm.lua:156: in function <data/lib/fire_storm.lua:139>

 

 

No sábado eu posto a parte do script que tá faltando nesse código. 

Postado
  Em 03/01/2020 em 01:58, movie disse:

No sábado eu posto a parte do script que tá faltando nesse código. 

 

ok, vou aguarda. !!

Senhoras e senhores, se alguma resposta lhe ajudou, marque-a como a melhor resposta e de ponto positivo, assim você incentiva quem lhe ajudou a continuar ajudando!!.

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.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.7k

Informação Importante

Confirmação de Termo