Ir para conteúdo
  • Cadastre-se

(Resolvido)Pedido Script p/ Quest


Ir para solução Resolvido por FlavioHulk,

Posts Recomendados

Boa noite galera, queria um script pra uma quest, que quando o Player desse use em um ActionID ele perdesse HP, ele teria que perder um total de HP que iria somando a cada Use que ele desse, quando batesse a meta do HP perdido ele ganharia o item (se possível um item com UniqueID), também teria que ser feito em um determinado tempo, caso esse tempo acaba-se a contagem do hp reiniciaria, só poderia ser feita 1x por dia (depois que o primeiro player a quest só poderia ser feita novamente no outro dia).

Só somaria o HP de um Player, se vários players ficassem usando cada um teria sua contagem independente, não somando um com o outro pra bater a meta, se for possível contar apenas HP (pra evitar o uso do utamo vita).

 

Versão TFS 1.2

Desde já obrigado.

Editado por RXSora (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
35 minutos atrás, FlavioHulk disse:

Qual sua distro?

 

Desculpa esqueci de avisar, vou editar, é o TFS 1.2

@FlavioHulk Desculpa novamente, adicionei mais uma informação ao topico, o player teria X segundos pra conseguir bater a meta de HP, caso não conseguisse no tempo a contagem do HP voltaria a 0.

Editado por RXSora (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
local config, players = {
	actionId = 1225, -- Action ID da quest.
	healthLose = 50, -- Quantidade de life perdido a cada clique.
	healthTotal = 10000, -- Quantidade a ser alcançada de life.
	reward = {
		[1] = {itemId = 2160, amount = 100}  -- Recompensa itemId e quantidade
	},
	globalStorage = 52220, -- Storage global
	storagePlayer = 52221 -- Storage do player
}, {}

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
	if item.actionid ~= config.actionId then
		return false
	end

	if Game.getStorageValue(globalStorage) > 0 then
		player:sendCancelMessage('The daily quest has already been made.')
		return true
	end

	if player:getStorageValue(config.storagePlayer) > 0 then
		player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'The chest is empty.')
		return true
	end

	local difference = player:getHealth() - config.healthLose
	player:addHealth( - difference)
	players[player:getId()] = ((players[player:getId()] == nil and 0 or players[player:getId()]) + config.healthLose)
	if players[player:getId()] == config.healthTotal then
		if not player then
			return false
		end
		
		for i = 1, #config.reward do
			local rewards = config.reward[i]
			player:addItem(rewards.itemId, rewards.amount)
		end
		Game.setStorageValue(config.globalStorage, 1)
		player:setStorageValue(config.storagePlayer, 1)
		player:sendTextMessage('You did the quest.')
		for k in pairs(players) do
			players[k] = nil
		end
	end
	return true
end

Testa aí, provavelmente há algum erro kk

Link para o post
Compartilhar em outros sites
15 minutos atrás, FlavioHulk disse:

local config, players = {
	actionId = 1225, -- Action ID da quest.
	healthLose = 50, -- Quantidade de life perdido a cada clique.
	healthTotal = 10000, -- Quantidade a ser alcançada de life.
	reward = {
		[1] = {itemId = 2160, amount = 100}  -- Recompensa itemId e quantidade
	},
	globalStorage = 52220, -- Storage global
	storagePlayer = 52221 -- Storage do player
}, {}

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
	if item.actionid ~= config.actionId then
		return false
	end

	if Game.getStorageValue(globalStorage) > 0 then
		player:sendCancelMessage('The daily quest has already been made.')
		return true
	end

	if player:getStorageValue(config.storagePlayer) > 0 then
		player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'The chest is empty.')
		return true
	end

	local difference = player:getHealth() - config.healthLose
	player:addHealth( - difference)
	players[player:getId()] = ((players[player:getId()] == nil and 0 or players[player:getId()]) + config.healthLose)
	if players[player:getId()] == config.healthTotal then
		if not player then
			return false
		end
		
		for i = 1, #config.reward do
			local rewards = config.reward[i]
			player:addItem(rewards.itemId, rewards.amount)
		end
		Game.setStorageValue(config.globalStorage, 1)
		player:setStorageValue(config.storagePlayer, 1)
		player:sendTextMessage('You did the quest.')
		for k in pairs(players) do
			players[k] = nil
		end
	end
	return true
end

Testa aí, provavelmente há algum erro kk

 

Deu erro msm kkkk erro1.jpg.19a3b433d22833ea8c7c7b5e6a48b011.jpg

Link para o post
Compartilhar em outros sites
local config, players = {
	actionId = 1225, -- Action ID da quest.
	healthLose = 50, -- Quantidade de life perdido a cada clique.
	healthTotal = 10000, -- Quantidade a ser alcançada de life.
	reward = {
		[1] = {itemId = 2160, amount = 100}  -- Recompensa itemId e quantidade
	},
	globalStorage = 52220, -- Storage global
	storagePlayer = 52221 -- Storage do player
}, {}

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
	if item.actionid ~= config.actionId then
		return false
	end

	if Game.getStorageValue(config.globalStorage) > 0 then
		player:sendCancelMessage('The daily quest has already been made.')
		return true
	end

	if player:getStorageValue(config.storagePlayer) > 0 then
		player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'The chest is empty.')
		return true
	end

	local difference = player:getHealth() - config.healthLose
	player:addHealth( - difference)
	players[player:getId()] = ((players[player:getId()] == nil and 0 or players[player:getId()]) + config.healthLose)
	if players[player:getId()] == config.healthTotal then
		if not player then
			return false
		end

		for i = 1, #config.reward do
			local rewards = config.reward[i]
			player:addItem(rewards.itemId, rewards.amount)
		end
		Game.setStorageValue(config.globalStorage, 1)
		player:setStorageValue(config.storagePlayer, 1)
		player:sendTextMessage('You did the quest.')
		for k in pairs(players) do
			players[k] = nil
		end
	end
	return true
end

 

Link para o post
Compartilhar em outros sites
15 minutos atrás, FlavioHulk disse:

local config, players = {
	actionId = 1225, -- Action ID da quest.
	healthLose = 50, -- Quantidade de life perdido a cada clique.
	healthTotal = 10000, -- Quantidade a ser alcançada de life.
	reward = {
		[1] = {itemId = 2160, amount = 100}  -- Recompensa itemId e quantidade
	},
	globalStorage = 52220, -- Storage global
	storagePlayer = 52221 -- Storage do player
}, {}

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
	if item.actionid ~= config.actionId then
		return false
	end

	if Game.getStorageValue(config.globalStorage) > 0 then
		player:sendCancelMessage('The daily quest has already been made.')
		return true
	end

	if player:getStorageValue(config.storagePlayer) > 0 then
		player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'The chest is empty.')
		return true
	end

	local difference = player:getHealth() - config.healthLose
	player:addHealth( - difference)
	players[player:getId()] = ((players[player:getId()] == nil and 0 or players[player:getId()]) + config.healthLose)
	if players[player:getId()] == config.healthTotal then
		if not player then
			return false
		end

		for i = 1, #config.reward do
			local rewards = config.reward[i]
			player:addItem(rewards.itemId, rewards.amount)
		end
		Game.setStorageValue(config.globalStorage, 1)
		player:setStorageValue(config.storagePlayer, 1)
		player:sendTextMessage('You did the quest.')
		for k in pairs(players) do
			players[k] = nil
		end
	end
	return true
end

 

 

Exatamente o mesmo erro .-.

Link para o post
Compartilhar em outros sites

Adiciona em:

data/lib/core/game.lua

if not globalStorageTable then
	globalStorageTable = {}
end

function Game.getStorageValue(key)
	return globalStorageTable[key] or -1
end

function Game.setStorageValue(key, value)
	globalStorageTable[key] = value
end

Testei o script e tudo está funcionando normalmente... Boa sorte !

 

local config, players = {
	actionId = 1225, -- Action ID da quest.
	healthLose = 50, -- Quantidade de life perdido a cada clique.
	healthTotal = 300, -- Quantidade a ser alcançada de life.
	reward = {
		[1] = {itemId = 2160, amount = 100}  -- Recompensa itemId e quantidade
	},
	globalStorage = 52220, -- Storage global
	storagePlayer = 52221 -- Storage do player
}, {}

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
	if item.actionid ~= config.actionId then
		return false
	end

	if Game.getStorageValue(config.globalStorage) > 0 then
		player:sendCancelMessage('The daily quest has already been made.')
		return true
	end

	if player:getStorageValue(config.storagePlayer) > 0 then
		player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'The chest is empty.')
		return true
	end

	local difference = player:getHealth() - config.healthLose
	player:addHealth( - difference)
	players[player:getId()] = ((players[player:getId()] == nil and 0 or players[player:getId()]) + config.healthLose)
	if players[player:getId()] == config.healthTotal then
		if not player then
			return false
		end

		for i = 1, #config.reward do
			local rewards = config.reward[i]
			player:addItem(rewards.itemId, rewards.amount)
		end
		Game.setStorageValue(config.globalStorage, 1)
		player:setStorageValue(config.storagePlayer, 1)
		player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'You did the quest.')
		for k in pairs(players) do
			players[k] = nil
		end
	end
	return true
end

 

Editado por FlavioHulk (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

@FlavioHulk Boa tarde man, obrigado novamente por estar me ajudando, acabaram os erros na Distro, porem esta com algum erro no script, quando eu dou Use uma vez o char fica com o HP determinado aqui;

 

	healthLose = 50, -- Quando dou Use fico com a quantidade que coloco pra perder, ou seja, se tenho 5000 de HP, dou Use fico com o valor registrado ali.

Ai depois eu fico dando use algumas vezes sem tomar dano, pois o HP já esta o mesmo do "HealthLose" logo ele não altera nada, e depois de alguns Uses eu pego a reward.

Não querendo abusar da sua bondade, mas eu também tinha pedido pra ter 1 determinado tempo pra conseguir perder a quantidade de HP necessário, por exemplo, se o player não conseguisse perder 1k de HP em 10 segundos a contagem reiniciaria.

Obrigado novamente pela ajuda que esta dando.

 

#Edit

Fiz um teste aqui, coloquei o meu char com 5000 de HP, coloquei HealthLose = 4999 (Perder 1 de HP por clique) e o HealthTotal = 10 (Teria que dar use 10 vezes), comi uma food pra ficar healando e fiz perder 20 de HP 1 por vez e não recebi o premio nem deu quest completa.

 

#Edit2

 

	local difference = config.healthLose

To de folga hoje tava dando uma olhada, tava aqui o erro ^^, agora falta o negocio do tempo, vou ir dando uma pesquisada ate vc aparecer dnv u.u

Editado por RXSora (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Adiciona esta função em lib/core/player.lua

function Player.setExhaustion(self, value, time)
    self:setStorageValue(value, time + os.time())
end
 
function Player.getExhaustion(self, value)
    local storage = self:getStorageValue(value)
    if not storage or storage <= os.time() then
        return 0
    end
 
    return storage - os.time()
end
 
function Player:hasExhaustion(value)
    return self:getExhaustion(value) >= os.time() and true or false
end

Testa esse script, e me retorna algum erro ou possível bug, pois estou fazendo esboços.

local config, players = {
	actionId = 1225, -- Action ID da quest.
	healthLose = 50, -- Quantidade de life perdido a cada clique.
	healthTotal = 300, -- Quantidade a ser alcançada de life.
	reward = {
		[1] = {itemId = 2160, amount = 100}  -- Recompensa itemId e quantidade
	},
	globalStorage = 52220, -- Storage global
	storagePlayer = 52221, -- Storage do player
	storageTime = 52222, -- Storage do Tempo
	time = 10 * 60 -- Tempo em segundos
}, {}

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
	if item.actionid ~= config.actionId then
		return false
	end

	if Game.getStorageValue(config.globalStorage) > 0 then
		player:sendCancelMessage('The daily quest has already been made.')
		return true
	end

	if player:getStorageValue(config.storagePlayer) > 0 then
		player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'The chest is empty.')
		return true
	end

	local difference = config.healthLose
	player:addHealth( - difference)
	if not player:hasExhaustion(config.storageTime) then
		if players[player:getId()] then
			players[player:getId()] = nil
			player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'Your sacrifice was reseted.')
		end
		player:setExhaustion(config.storageTime, config.time)
	end

	players[player:getId()] = ((players[player:getId()] == nil and 0 or players[player:getId()]) + config.healthLose)
	if players[player:getId()] == config.healthTotal then
		if not player then
			return false
		end

		for i = 1, #config.reward do
			local rewards = config.reward[i]
			player:addItem(rewards.itemId, rewards.amount)
		end
		Game.setStorageValue(config.globalStorage, 1)
		player:setStorageValue(config.storagePlayer, 1)
		player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'You did the quest.')
		for k in pairs(players) do
			players[k] = nil
		end
	end
	return true
end
Link para o post
Compartilhar em outros sites

@FlavioHulk Não deu erro na distro, porem eu vou usando infinitamente e não recebo o premio e fica aparecendo que foi resetado a cada use que dou após o primeiro Use.

Fiz o teste alterando o "time" para "times" por que "time" tava ficando azul, como se fosse 1 palavra reservada, alterei tbm o tempo para "10000 * 60" pra ver se não era nenhum bug no tempo, não adiantou de nada.

 

Obrigado novamente.

Editado por RXSora (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
  • Solução
local config, players = {
	actionId = 1225, -- Action ID da quest.
	healthLose = 50, -- Quantidade de life perdido a cada clique.
	healthTotal = 300, -- Quantidade a ser alcançada de life.
	reward = {
		[1] = {itemId = 2160, amount = 100}  -- Recompensa itemId e quantidade
	},
	globalStorage = 52220, -- Storage global
	storagePlayer = 52221, -- Storage do player
	storageTime = 52222, -- Storage do Tempo
	time = 10 -- Tempo em segundos
}, {}

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
	if item.actionid ~= config.actionId then
		return false
	end

	if Game.getStorageValue(config.globalStorage) > 0 then
		player:sendCancelMessage('The daily quest has already been made.')
		return true
	end

	if player:getStorageValue(config.storagePlayer) > 0 then
		player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'The chest is empty.')
		return true
	end

	local difference = config.healthLose
	player:addHealth( - difference)
	if player:getExhaustion(config.storageTime) <= 0 then
		if players[player:getId()] then
			players[player:getId()] = nil
			player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'Your sacrifice was reseted.')
		end
		
		player:setExhaustion(config.storageTime, config.time)
	end

	players[player:getId()] = ((players[player:getId()] == nil and 0 or players[player:getId()]) + config.healthLose)
	if players[player:getId()] == config.healthTotal then
		if not player then
			return false
		end

		for i = 1, #config.reward do
			local rewards = config.reward[i]
			player:addItem(rewards.itemId, rewards.amount)
		end
		Game.setStorageValue(config.globalStorage, 1)
		player:setStorageValue(config.storagePlayer, 1)
		player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'You did the quest.')
		for k in pairs(players) do
			players[k] = nil
		end
	end
	return true
end

Cara, testei totalmente esse script, e funciona como deveria.. Lembra-se de não dar reload no script, senão a tabela irá resetar !

Link para o post
Compartilhar em outros sites
  • 10 months later...
Em 08/10/2018 em 23:01, FlavioHulk disse:

local config, players = {
	actionId = 1225, -- Action ID da quest.
	healthLose = 50, -- Quantidade de life perdido a cada clique.
	healthTotal = 300, -- Quantidade a ser alcançada de life.
	reward = {
		[1] = {itemId = 2160, amount = 100}  -- Recompensa itemId e quantidade
	},
	globalStorage = 52220, -- Storage global
	storagePlayer = 52221, -- Storage do player
	storageTime = 52222, -- Storage do Tempo
	time = 10 -- Tempo em segundos
}, {}

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
	if item.actionid ~= config.actionId then
		return false
	end

	if Game.getStorageValue(config.globalStorage) > 0 then
		player:sendCancelMessage('The daily quest has already been made.')
		return true
	end

	if player:getStorageValue(config.storagePlayer) > 0 then
		player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'The chest is empty.')
		return true
	end

	local difference = config.healthLose
	player:addHealth( - difference)
	if player:getExhaustion(config.storageTime) <= 0 then
		if players[player:getId()] then
			players[player:getId()] = nil
			player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'Your sacrifice was reseted.')
		end
		
		player:setExhaustion(config.storageTime, config.time)
	end

	players[player:getId()] = ((players[player:getId()] == nil and 0 or players[player:getId()]) + config.healthLose)
	if players[player:getId()] == config.healthTotal then
		if not player then
			return false
		end

		for i = 1, #config.reward do
			local rewards = config.reward[i]
			player:addItem(rewards.itemId, rewards.amount)
		end
		Game.setStorageValue(config.globalStorage, 1)
		player:setStorageValue(config.storagePlayer, 1)
		player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'You did the quest.')
		for k in pairs(players) do
			players[k] = nil
		end
	end
	return true
end

Cara, testei totalmente esse script, e funciona como deveria.. Lembra-se de não dar reload no script, senão a tabela irá resetar !

 

poderia atualizar esse script para tfs 0.4 por favor?

 

Link para o post
Compartilhar em outros sites

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

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo