LU
tfs 1.2

Piso com time

Por Lumus, 13 de ago. de 2015 em Scripts

18
4.5k
LumusL
13 de agosto de 2015 às 13:18

Alguém poderia me auxiliar no addEvent? para que ele faça:

 

Ele se repita durante 30 segundos, enviando a MSG para o player:

 

player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Tempo: ".. left .."")

 

Durante 30 segundos, mas só o player que tiver X storage. Ao dar 30 segundos, ele manda:

player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Seu tempo acabou.") e teleporta pro templo.

 

Tentei de diversas formas mas não consegui. Se puderem ajudar, agradeço imensamente.

 

Editado Agosto 13 por Fawz

BrunoB
13 de agosto de 2015 às 15:04

Alguém poderia me auxiliar no addEvent? para que ele faça:

 

Ele se repita durante 30 segundos, enviando a MSG para o player:

 

player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Tempo: ".. left .."")

 

Durante 30 segundos, mas só o player que tiver X storage. Ao dar 30 segundos, ele manda:

player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Seu tempo acabou.") e teleporta pro templo.

 

Tentei de diversas formas mas não consegui. Se puderem ajudar, agradeço imensamente.

Esse evento seria ao clicar no item, pisar em um determinado piso, como?

LumusL
13 de agosto de 2015 às 15:08

Esse evento seria ao clicar no item, pisar em um determinado piso, como?

É um NPC funciona assim:

Você começa com tempo de 30 segundos para ir em determinados pisos espalhados num labirinto. A cada piso que você andar, você ganha 15k em gps e mais 10 segundos para continuar dentro dele. Se dentro dos 30 segundos você não pisar em nenhum dos pisos, você é mandado pra fora do labirinto, aonde o NPC está sem ganhar nada.

Cada vez que pisa no piso, ganha 10 segundos a mais que são somados no tempo atual ex: demorei 5 segundos pra achar o primeiro piso, então, tenho 25 segundos pisei no piso ganho mais 10, vou pra 35.

 

Consegui explicar direitinho?

BrunoB
13 de agosto de 2015 às 15:45

É um NPC funciona assim:

Você começa com tempo de 30 segundos para ir em determinados pisos espalhados num labirinto. A cada piso que você andar, você ganha 15k em gps e mais 10 segundos para continuar dentro dele. Se dentro dos 30 segundos você não pisar em nenhum dos pisos, você é mandado pra fora do labirinto, aonde o NPC está sem ganhar nada.

Cada vez que pisa no piso, ganha 10 segundos a mais que são somados no tempo atual ex: demorei 5 segundos pra achar o primeiro piso, então, tenho 25 segundos pisei no piso ganho mais 10, vou pra 35.

 

Consegui explicar direitinho?

Testa esse piso...

 

movements.xml:

<movevent event="StepIn" actionid="51993" script="labirinto.lua"/>
labirinto.lua:

 

local config = {
	str = 51993,
	time = 30, -- segundos
	pos = {x = 162, y = 51, z = 6} -- posição para teleportar o player quando o tempo acabar
}

function onStepIn(creature, item, position, fromPosition)
	if not creature:isPlayer() then return false end
	
	creature:setStorageValue(config.str, config.time)
	local function countDown(uid)
		if creature:getStorageValue(config.str) > 0 then
			creature:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Tempo: " .. creature:getStorageValue(config.str))
			creature:setStorageValue(config.str, (creature:getStorageValue(config.str) - 1))
			addEvent(countDown, 1000, creature.uid)
		else
			creature:teleportTo(config.pos)
			creature:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Seu tempo acabou.") 
		end
	end
    
	addEvent(countDown, 1000, creature.uid)
	return true
end

 

LumusL
13 de agosto de 2015 às 16:04

Funcionou perfeitamente. Pode me dar uma luz quanto ao NPC?

 

Tipo: o movement na verdade, só vai dar os 10 segundos a cada vez q ele pisar num piso, ao todo são 10 pisos, e ele só pode pisar 1x em cada. Ai acrescenta 10 segundos no tempo que ele já tem.

Editado Agosto 13 por Fawz

BrunoB
13 de agosto de 2015 às 16:12

Funcionou perfeitamente. Pode me dar uma luz quanto ao NPC?

 

Tipo: o movement na verdade, só vai dar os 10 segundos a cada vez q ele pisar num piso, ao todo são 10 pisos, e ele só pode pisar 1x em cada. Ai acrescenta 10 segundos no tempo que ele já tem.

Me da mais detalhes do npc...

LumusL
13 de agosto de 2015 às 16:23

Me da mais detalhes do npc...

Tu chega no NPC e fala:

 

Player: Hi

NPC: Olá, Player. Eu tenho um desafio pra hoje! Ou pode reportar um.

Player: Desafio

NPC: Este desafio é bem simples. Você tem 30 segundos iniciais para pisar em certos locais dentro do labirinto. Cada piso que você conseguir pisar, te darão mais 10 segundos para ficar lá dentro e você ganha 15k em gps. Quanto mais você pisar, mais dinheiro vai ganhar. Você aceita?

Sim

Boa sorte! Você tem: X segundos.

---

A partir daqui já começa a mandar a msg:

16:15 Tempo: 30

16:15 Tempo: 29

16:15 Tempo: 28...

 

Ai o player vai e pisa em 1 dos pisos, exemplo:

Antes de pisar ele estava com 23 segundos ele pisa, ganha 15k + 10 segundos... ficando com 33 segundos de tempo. Se ele conseguir pisar nos 10 pisos já definidos no tempo que ele conseguir, ele sai do labirinto e volta a falar com o NPC:

Player: Hi

NPC: Olá, Player. Eu tenho um desafio pra hoje! Ou pode reportar um.

Player: reportar

NPC:Parabéns, você conseguiu, leve mais 500k com você!

Se dentro do prazo dos segundos chegar a 0 ele é mandado pra fora

 

Deu pra entender direitnho bruno? Desde-já agradeço.

Editado Agosto 13 por Fawz

BrunoB
13 de agosto de 2015 às 17:43

Deu pra entender direitnho bruno? Desde-já agradeço.

Em data/lib/core/constants.lua adicione:

LABIRINTO = {
	STORAGE_MISSION = 51988, -- storage para controle da quest
	STORAGE_TIME = 51989, -- storage para controle do tempo
	STORAGE_AUX = 51987, -- storage auxilair
	TIME_NPC = 30, -- tempo em segundos para o tempo do npc
	TIME_TILES = 10, -- tempo em segundos para o tempo dos pisos
	PRIZE = 15000, -- gold coins que o player ira ganhar ao pisao no piso
	PRIZE_FINISH = 500000, -- gold coins que o player ira ganhar ao finalizar a quest
	POS_START = {x = 5, y = 6, z = 7}, -- posição para começar o labirinto
	POS_LEAVE = {x = 7, y = 8, z = 9},-- posição para teleportar o player quando o tempo acabar
	LAST_AID = 51999 -- actionid do último piso
}
XML do tile:

<movevent event="StepIn" fromuid="51990" touid="51999" script="xxx.lua" />
Ai você colocar uma uniqueid em cada piso (essa uniqueid tem que ser uma para ser usada como storage de controle dos pisos também).

 

Tile:

 

function onStepIn(creature, item, position, fromPosition)
	if not creature:isPlayer() then return false end
	if creature:getStorageValue(item.uid) <= 0 then
		creature:setStorageValue(LABIRINTO.STORAGE_AUX, 1)
		creature:setStorageValue(LABIRINTO.STORAGE_TIME, (creature:getStorageValue(LABIRINTO.STORAGE_TIME) + LABIRINTO.TIME_TILES))
		creature:setStorageValue(item.uid, 1)
		creature:addMoney(LABIRINTO.PRIZE)
		if item.aid == LABIRINTO.LAST_AID then
			creature:setStorageValue(LABIRINTO.STORAGE_MISSION, 2)
		end
	elseif creature:getStorageValue(item.uid) > 0 then
		return true
	end

	local function countDown(uid)
		if creature:getStorageValue(LABIRINTO.STORAGE_TIME) > 0 then
			creature:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Tempo: " .. creature:getStorageValue(LABIRINTO.STORAGE_TIME))
			creature:setStorageValue(LABIRINTO.STORAGE_TIME, (creature:getStorageValue(LABIRINTO.STORAGE_TIME) - 1))
			addEvent(countDown, 1000, creature.uid)
		else
			creature:teleportTo(LABIRINTO.POS_LEAVE)
			creature:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Seu tempo acabou.") 
		end
	end

	addEvent(countDown, 1000, creature.uid)
	return true
end

 

 

Npc:

 

local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)

function onCreatureAppear(cid)              npcHandler:onCreatureAppear(cid)            end
function onCreatureDisappear(cid)           npcHandler:onCreatureDisappear(cid)         end
function onCreatureSay(cid, type, msg)      npcHandler:onCreatureSay(cid, type, msg)    end
function onThink()                          npcHandler:onThink()                        end

local function greetCallback(cid)
	local player = Player(cid)

	npcHandler:say("Olá, " .. player:getName() .. ". Eu tenho um {desafio} pra hoje! Ou você pode {reportar} um.", cid)
	return true
end

local function countDown(uid)
	local self = Player(uid)
	if self:getStorageValue(LABIRINTO.STORAGE_TIME) > 0 and self:getStorageValue(LABIRINTO.STORAGE_AUX) == 0  then
		self:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Tempo: " .. self:getStorageValue(LABIRINTO.STORAGE_TIME))
		self:setStorageValue(LABIRINTO.STORAGE_TIME, (self:getStorageValue(LABIRINTO.STORAGE_TIME) - 1))
		addEvent(countDown, 1000, self.uid)
	else
		self:teleportTo(LABIRINTO.POS_LEAVE)
		self:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Seu tempo acabou.") 
	end
end

local function creatureSayCallback(cid, type, msg)
	if not npcHandler:isFocused(cid) then
		return false
	end

	local player = Player(cid)
	if msgcontains(msg, "desafio") and npcHandler.topic[cid] == 0 then
		if player:getStorageValue(LABIRINTO.STORAGE_MISSION) <= 0 then
			npcHandler:say("Este desafio é bem simples. Você tem 30 segundos iniciais para pisar em certos locais dentro do labirinto. Cada piso que você conseguir pisar, te darão mais 10 segundos para ficar lá dentro e você ganha 15k em gps. Quanto mais você pisar, mais dinheiro vai ganhar. Você aceita?", cid)
			npcHandler.topic[cid] = 1
		else
			npcHandler:say("Você já teve sua chance.", cid)
			npcHandler.topic[cid] = 0
		end
	elseif msgcontains(msg, "sim") and npcHandler.topic[cid] == 1 then
		npcHandler:say("Boa sorte! Você tem: " .. LABIRINTO.TIME_NPC .. " segundos.", cid)
		player:teleportTo(LABIRINTO.POS_START)
		player:setStorageValue(LABIRINTO.STORAGE_MISSION, 1)
		player:setStorageValue(LABIRINTO.STORAGE_TIME, LABIRINTO.TIME_NPC)
		player:setStorageValue(LABIRINTO.STORAGE_AUX, 0)
		addEvent(countDown, 1000, player.uid)
		npcHandler.topic[cid] = 0
	elseif msgcontains(msg, "reportar") and player:getStorageValue(LABIRINTO.STORAGE_MISSION) == 2 then
		npcHandler:say("Parabéns, você conseguiu, leve mais " .. math.ceil(LABIRINTO.PRIZE_FINISH / 1000) .. "k com você!", cid)
		creature:addMoney(LABIRINTO.PRIZE_FINISH)
		player:setStorageValue(LABIRINTO.STORAGE_MISSION, 3)
		npcHandler.topic[cid] = 0
	end
	return true
end

npcHandler:setCallback(CALLBACK_ONADDFOCUS, onAddFocus)
npcHandler:setCallback(CALLBACK_ONRELEASEFOCUS, onReleaseFocus)

npcHandler:setCallback(CALLBACK_GREET, greetCallback)
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

 

Editado Agosto 14 por Bruno Minervino

LumusL
13 de agosto de 2015 às 18:29

Deu um erro: O NPC teleporta ele normal, porém ao ser teleportado a msg fica:

18:27 Tempo: 30
18:27 Tempo: 30
18:27 Tempo: 30
18:27 Tempo: 30
18:27 Tempo: 30
Quando tu pisa lá nos pisos, buga mais ainda, o tempo só fica repetindo interruptamente.

Editado Agosto 13 por Fawz

BrunoB
14 de agosto de 2015 às 00:31

Deu um erro: O NPC teleporta ele normal, porém ao ser teleportado a msg fica:

18:27 Tempo: 30

18:27 Tempo: 30

18:27 Tempo: 30

18:27 Tempo: 30

18:27 Tempo: 30

 

Quando tu pisa lá nos pisos, buga mais ainda, o tempo só fica repetindo interruptamente.

Refaz os procedimentos, editei os scripts...

LumusL
14 de agosto de 2015 às 00:53

Refaz os procedimentos, editei os scripts...

Agora o tempo desce beleza só que:

 

ao pisar nos pisos em vez de dar os 10 segundos, está removendo o tempo mais rapidamente.

E seu eu piso em 3 tiles:

 

00:51 Seu tempo acabou.
00:51 Seu tempo acabou.
00:51 Seu tempo acabou.
BrunoB
14 de agosto de 2015 às 09:19

Agora o tempo desce beleza só que:

 

ao pisar nos pisos em vez de dar os 10 segundos, está removendo o tempo mais rapidamente.

E seu eu piso em 3 tiles:

 

00:51 Seu tempo acabou.

00:51 Seu tempo acabou.

00:51 Seu tempo acabou.

Editei o script de tile...

Muda a tag xml e o script em si, e no mapa, ao invés de colocar actionid, coloca uniqueid.

LumusL
14 de agosto de 2015 às 12:37

Ele é teleportado para dentro o tempo começa a descer de boa só que:

 

Ao pisar no 1° piso:

O tempo adiciona mais 10 segundos e teleporta ele pra fora com a msg:

12:33 Seu tempo acabou.

 

Ao falar com o NPC:

reportar ele não responde nada e quando falo desafio: Você já teve sua chance.

LumusL
18 de agosto de 2015 às 14:48

Alguém pode me ajudar a resolver o outro erro? :/

zipter98Z
19 de agosto de 2015 às 14:26

Troque:

 

player:setStorageValue(LABIRINTO.STORAGE_TIME, LABIRINTO.TIME_NPC)

por:

 

player:setStorageValue(LABIRINTO.STORAGE_TIME, os.time() + LABIRINTO.TIME_NPC)