Ir para conteúdo
  • 0

Poção que cura com base na vida máxima


bperotto

Pergunta

Boa tarde a todos,

 

Eu gostaria de pedir o apoio de vocês com um script. Estou precisando alterar a cura das poções do meu sistema, mas eu preciso que elas curem com base na vida máxima do player.

Exemplo uma poção de vida que cure 40% da vida máxima:
Um personagem de 3000 de vida, curaria 1200, enquanto um personagem de 1000 de vida curaria 400.

Desde já, meus agradecimentos.

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0
Em 27/06/2020 em 14:04, bperotto disse:

Boa tarde a todos,

 

Eu gostaria de pedir o apoio de vocês com um script. Estou precisando alterar a cura das poções do meu sistema, mas eu preciso que elas curem com base na vida máxima do player.

Exemplo uma poção de vida que cure 40% da vida máxima:
Um personagem de 3000 de vida, curaria 1200, enquanto um personagem de 1000 de vida curaria 400.

Desde já, meus agradecimentos.

Qual é a versão de TFS?

 

Eu fiz um script baseado na versão de TFS 0.3.6/0.4

 

-- LUA --

 

Se você já tem o arquivo do script criado ignore o restante dessa linha e vá para o código, caso não tenha, vá em Data/Actions/Scripts e crie o arquivo potions.lua e adiciona o script:

--------------- POTION QUE CURA BASEADO NA PORCENTAGEM DA VIDA MÁXIMA BY YAN18 ---------------

----- FUNÇÃO PARA CURAR O PLAYER -----
function doHealPlayer(cid, porcentagem_hp, effect, message_heal)                   
local porcentagem = math.abs(porcentagem_hp / 100) -- PEGA O VALOR INTEIRO PASSADO DO PARÂMETRO DESEJADO COMO A PORCENTAGEM E DIVIDE POR 100 PARAR GERAR A PORCENTAGEM
local life_recovered = math.floor(getCreatureMaxHealth(cid) * porcentagem) -- QUANTIDADE DE HP QUE VAI RECUPERAR
	
	doSendMagicEffect(getThingPos(cid), effect)	
	doCreatureAddHealth(cid, life_recovered)
	
	-- CONDICIONAL PARA EXIBIR MENSAGEM EM CIMA DO PLAYER AO CURAR --
	if message_heal then
		doCreatureSay(cid, "Life recovered...")
	end
	
	doPlayerSendCancel(cid, "Life recovered...") -- MENSAGEM BRANCE EM CIMA DO CONSOLE
	doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You recovered " ..life_recovered.. " of your maximum life.")	
end

--------- TABELA COM O ID, PORCENTAGEM E EFEITO DAS POTIONS ---------
local potions = {
[12344] = {porcentagem = 40, effect = 14}, -- ID, PORCENTAGEM E EFEITO DA POTION
[12345] = {porcentagem = 40, effect = 14}, -- ID, PORCENTAGEM E EFEITO DA POTION
[12346] = {porcentagem = 40, effect = 12}, -- ID, PORCENTAGEM E EFEITO DA POTION
[12347] = {porcentagem = 40, effect = 13}, -- ID, PORCENTAGEM E EFEITO DA POTION
[12348] = {porcentagem = 40, effect = 13}, -- ID, PORCENTAGEM E EFEITO DA POTION   
}

---------------------------------------- CÓDIGO ----------------------------------------

function onUse(cid, item, fromPosition, itemEx, toPosition)
local verificar_batalha = true -- VARIÁVEL QUE VERIFICA SE ESTÁ EM BATALHA PARA USAR A POTION

	if not isCreature(cid) or not getCreatureMaster(cid) then 
		return doPlayerSendCancel(cid, "You only can use this potion in you.")
	end
		
	if getCreatureHealth(cid) == getCreatureMaxHealth(cid) then
		return doPlayerSendCancel(cid, "You are already with full health.")
	end	
	
	-- VERIFICA SE ESTÁ EM BATALHA --
	if verificar_batalha then
		if getCreatureCondition(cid, CONDITION_INFIGHT) then
			doPlayerSendCancel(cid, "You can't use this potion during a battle.")
			doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You can't use this potion during a battle.")
		return true
		end
	end		

	doRemoveItem(item.uid, 1)	
	doHealPlayer(cid, potions[item.itemid].porcentagem, potions[item.itemid].effect, true)

return true
end	

* Explicação sobre o script: Eu criei uma função que recupera vida do player de acordo com a vida máxima, ela contém quatro parâmetros, que é: criatura, porcentagem baseado na vida máxima, efeito da potion e se exibe mensagem que está curando (esse último argumento é mais estética e não muda e interfere em nada na cura), mas, caso não queira essas mensagens (em cima do player e em cima do console), lá no fim do script dentro da função onUse, mude o último parâmetro da função doHealPlayer de true para false, ficando:

doHealPlayer(cid, potions[item.itemid].porcentagem, potions[item.itemid].effect, false)

 

Em cima da função onUse tem a tabela com as potions, então no índice ([] colchetes) coloque o id da potion e na tabela dentro do id tem o valor da porcentagem e efeito da potion. No valor da porcentagem passe a quantidade direto (10, 20, 30 por exemplo) pois eu já estou criando a porcentagem dentro da função (valor dividido por 100 para criar a porcentagem), deixei bem simples para você.  Então com a tabela você consegue inserir mais de uma potion, caso só queira usar 1, pode apagar a tabela e passar o id e efeito da potion direto na função doHealPlayer no segundo e terceiro parâmetro:

doHealPlayer(cid, 14523, 25, true)

Fiz um exemplo acima, também pode deixar só 1 potion na tabela, não tem problema! É até melhor para não correr risco de acabar pagando o que não deve, mas, nesse caso apague os elementos restantes da tabela deixando só um.

 

E por fim, fiz uma verificação para verificar se o player está em batalha, e se estiver, não usa a potion. Caso queira mudar isso, só mudar o valor da variável verificar_batalha de true para false:

local verificar_batalha = false

 

-- XML --

 

Terminado a explicação sobre o script, agora é a parte do xml. Caso, já tenha a tag da potion criada, pode ignorar essa parte, mas lembrando que precisa colocar os mesmos ID das potions da tag xml na tabela do script.lua caso optou em manter a tabela. Mas, se não criou a tag xml, vamos lá! Abra o actions.xml e adicione a tag:

<action itemid="12344-12348" event="script" value="potions.lua"/>

Lembrando que se você está usando mais de 1 potion e os id delas não são em sequência, precisa tirar o hífen (-) da tag xml e colocar ponto e vírgula (;) para separar os id, pois com hífen é quando é mais de 1 id que são em sequência.

 

Testa e me fala se deu algum problema. Qualquer dúvida só falar.

Editado por Yan18
Link para o comentário
Compartilhar em outros sites

  • 0
28 minutos atrás, LeoTK disse:

@Yan18 conseguiria adicionar um math.random para variar entre 30 a 40 na porcentagem da vida, para não ficar um valor fixo de cura?

Sim, é bem simples, da para fazer de duas maneiras (que no fim da na mesma), pode ser trocando a constante do valor da porcentagem na tabela por:

local potions = {
[12344] = {porcentagem = math.floor(math.random(30, 40)), effect = 14}, -- ID, PORCENTAGEM E EFEITO DA POTION
[12345] = {porcentagem = math.floor(math.random(30, 40)), effect = 14}, -- ID, PORCENTAGEM E EFEITO DA POTION
[12346] = {porcentagem = math.floor(math.random(30, 40)), effect = 12}, -- ID, PORCENTAGEM E EFEITO DA POTION
[12347] = {porcentagem = math.floor(math.random(30, 40)), effect = 13}, -- ID, PORCENTAGEM E EFEITO DA POTION
[12348] = {porcentagem = math.floor(math.random(30, 40)), effect = 13}, -- ID, PORCENTAGEM E EFEITO DA POTION   
}

Ou passando direto no parâmetro da função:

doHealPlayer(cid, math.floor(math.random(30, 40)), potions[item.itemid].effect, true)

Mas, a segunda maneira é indicada se você só está usando 1 potion (1 item (id)), e se só for 1 item e não usar tabela, tem que mudar o terceiro parâmetro da função para:

doHealPlayer(cid, math.floor(math.random(30, 40)), 27, true) -- ID DO EFEITO DIRETO

Mas, mesmo se usar só 1 item, recomendo deixar a tabela, porque se futuramente adicionar mais, é só adicionar na tabela que na função pega a potion pelo id no índice da tabela.

Editado por Yan18
Link para o comentário
Compartilhar em outros sites

  • 0
22 horas atrás, LeoTK disse:

realmente a primeira opção é a melhor para adicionar diversos itens que tenham uma porcentagem de cura diferente

Exato, mas esqueci de mencionar uma coisa. Caso queira aleatório assim, vai ter que mover a tabela das potions para dentro da função onUse, pois, se deixar fora, a primeira vez que usar a potion vai pegar um valor aleatório (de acordo com cada item e o valor gerado aleatório para ele), porém nas próximas vezes vai ficar sempre aquele valor, pois como as pastas são carregadas em memória, então fora do onUse ele armazena aquele valor em memória e nunca é alterado. Por exemplo, vamos supor que você tem 2 potion na tabela e a de uma o random deu 35 e a outra 38, se deixar a tabela fora da função onUse vai ficar sempre curando 35 uma e a outra 38 até reiniciar o servidor ou atualizar a pasta Actions.

 

Então o certo é mover a tabela dentro da função onUse, para que a cada uso, gere um novo valor:

--------------- POTION QUE CURA BASEADO NA PORCENTAGEM DA VIDA MÁXIMA BY YAN18 ---------------

----- FUNÇÃO PARA CURAR O PLAYER -----
function doHealPlayer(cid, porcentagem_hp, effect, message_heal)                   
local porcentagem = math.abs(porcentagem_hp / 100) -- PEGA O VALOR INTEIRO PASSADO DO PARÂMETRO DESEJADO COMO A PORCENTAGEM E DIVIDE POR 100 PARAR GERAR A PORCENTAGEM
local life_recovered = math.floor(getCreatureMaxHealth(cid) * porcentagem) -- QUANTIDADE DE HP QUE VAI RECUPERAR
	
	doSendMagicEffect(getThingPos(cid), effect)	
	doCreatureAddHealth(cid, life_recovered)
	
	-- CONDICIONAL PARA EXIBIR MENSAGEM EM CIMA DO PLAYER AO CURAR --
	if message_heal then
		doCreatureSay(cid, "Life recovered...")
	end
	
	doPlayerSendCancel(cid, "Life recovered...") -- MENSAGEM BRANCE EM CIMA DO CONSOLE
	doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You recovered " ..life_recovered.. " of your maximum life.")	
end

---------------------------------------- CÓDIGO ----------------------------------------

function onUse(cid, item, fromPosition, itemEx, toPosition)
--------- TABELA COM O ID, PORCENTAGEM E EFEITO DAS POTIONS ---------
local potions = {
[12344] = {porcentagem = math.floor(math.random(30, 40)), effect = 14}, -- ID, PORCENTAGEM E EFEITO DA POTION
[12345] = {porcentagem = math.floor(math.random(30, 40)), effect = 14}, -- ID, PORCENTAGEM E EFEITO DA POTION
[12346] = {porcentagem = math.floor(math.random(30, 40)), effect = 12}, -- ID, PORCENTAGEM E EFEITO DA POTION
[12347] = {porcentagem = math.floor(math.random(30, 40)), effect = 13}, -- ID, PORCENTAGEM E EFEITO DA POTION
[12348] = {porcentagem = math.floor(math.random(30, 40)), effect = 13}, -- ID, PORCENTAGEM E EFEITO DA POTION   
}

local verificar_batalha = true -- VARIÁVEL QUE VERIFICA SE ESTÁ EM BATALHA PARA USAR A POTION

	if not isCreature(cid) or not getCreatureMaster(cid) then 
		return doPlayerSendCancel(cid, "You only can use this potion in you.")
	end
		
	if getCreatureHealth(cid) == getCreatureMaxHealth(cid) then
		return doPlayerSendCancel(cid, "You are already with full health.")
	end	
	
	-- VERIFICA SE ESTÁ EM BATALHA --
	if verificar_batalha then
		if getCreatureCondition(cid, CONDITION_INFIGHT) then
			doPlayerSendCancel(cid, "You can't use this potion during a battle.")
			doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You can't use this potion during a battle.")
		return true
		end
	end		

	doRemoveItem(item.uid, 1)	
	doHealPlayer(cid, potions[item.itemid].porcentagem, potions[item.itemid].effect, true)

return true
end	

 

Link para o comentário
Compartilhar em outros sites

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...