FJ
pedido

Algumas passivas

Por Fjinst, 15 de fev. de 2016 em Scripts

21
5.2k
FjinstF
15 de fevereiro de 2016 às 21:53

Olá, eu gostaria de pedir uma ajuda a vocês.

Sempre tive uma curiosidade de se é possivel fazer o sistema de passivas por storages para alguns otservs

 

O sistema consistiria no seguinte, se o player tiver tal storage no seu char ele terá essa passiva.

 

 

As passivas nas quais eu estou pedindo seriam as:

 

Uma de block, ou seja o player tem uma chance de 10% de negar qualquer dano

 

Uma de imortalidade, que o player teria uma chance de 10% de ficar 5 minutos imune a qualquer dano.

 

Se vocês tiverem como me ajudar, agradeço!

Night WolfN
15 de fevereiro de 2016 às 22:28

a primeira é um creaturescript onStatsChange, pra cada dano q ele receber vc checa se tem a storage que vc quer e faz um math.random(1, 100), se for <= 10 então retorna falso, do contrário retorna true.

a segunda passiva ativaria ao ser atacado tb? pq se for a é a mesma coisa que a primeira só que ai eu verificaria três coisas:
1- vc checa se tem a storage1 que vc quer e faz um math.random(1, 100), se for <= 10 então muda o storage2 pra ser os.time() + 5 * 60 [5 MINUTOS]
2- checa se o storage2 - os.time() <= 0 e retorna true ou falso
3- na primeira checagem vc tem que checar se ela ja não está ativada. Pra não acabar re-ativando com ela já ativada.

FjinstF
15 de fevereiro de 2016 às 23:55

Se não for pedir muito, teria como você fazer para mim?

Night WolfN
16 de fevereiro de 2016 às 00:19

porque vc não tenta fazer e eu vou te ajudando pra direcionar rumo à resposta correta? acho q vc aprenderia mais desse modo...

FurabioF
16 de fevereiro de 2016 às 00:23

Versão TFS??

FjinstF
16 de fevereiro de 2016 às 01:18

Eu só conheço a linguagem lua das versões 8.10 pra baixo, apartir da 8.2+ mudou totalmente, então meio que me perdi, Quando tento fazer esses scripts utilizando outros de outras pessoas acabo me perdendo e bugando tudo,

Versão TFS 0.36

Tibia: 8.54

FurabioF
16 de fevereiro de 2016 às 01:20

O.36 tem statschange wolf??

Night WolfN
16 de fevereiro de 2016 às 02:30

sim

DarkrausD
16 de fevereiro de 2016 às 03:21

a primeira é um creaturescript onStatsChange, pra cada dano q ele receber vc checa se tem a storage que vc quer e faz um math.random(1, 100), se for <= 10 então retorna falso, do contrário retorna true.

 

a segunda passiva ativaria ao ser atacado tb? pq se for a é a mesma coisa que a primeira só que ai eu verificaria três coisas:

1- vc checa se tem a storage1 que vc quer e faz um math.random(1, 100), se for <= 10 então muda o storage2 pra ser os.time() + 5 * 60 [5 MINUTOS]

2- checa se o storage2 - os.time() <= 0 e retorna true ou falso

3- na primeira checagem vc tem que checar se ela ja não está ativada. Pra não acabar re-ativando com ela já ativada.

Desculpe a falta de noção...Wolf...mas,

onStatsChange é um callback certo? que ativa quando a criatura ou player perde hp/mana,

se fazer o script dessa forma não daria erro em bloquear? porque tecnicamente o dano já teria sido removido...

estou tentando aprender, portanto posso estar completamente errado :smile_positivo:

 

Quase sempre que faço um script da um erro de sintaxe ou na propria logica da programação...

por isso nem vou arriscar esse que parece bem mais complexo.

Editado Fevereiro 16 por Darkraus

Night WolfN
16 de fevereiro de 2016 às 03:46

@@Darkraus

statschange

quando é executada:
-Quando um player ou monstro ou ganha ou perde vida/mana de um combat ou uma função (combats não são só os das spells, mas também weapons/fist/melee... vale lembrar também que monstros não possuem mana)

Parametros:
- cid = creatureid do player ou monstro q ganha/perde vida/mana
- attacker = creatureid do player ou monstro que causou a mudança na health/mana
- type = tipo da mudança, sendo ela:Ganho de vida, perca de vida, ganho de mana e perca de mana vide tabela abaixo:

STATSCHANGE_HEALTHGAIN = 0
STATSCHANGE_HEALTHLOSS = 1
STATSCHANGE_MANAGAIN = 2
STATSCHANGE_MANALOSS = 3

- combat = o tipo de combat que causou a alteração, sendo esses tipos:

COMBAT_NONE = 0
COMBAT_PHYSICALDAMAGE = 1
COMBAT_ENERGYDAMAGE = 2
COMBAT_EARTHDAMAGE = 4
COMBAT_POISONDAMAGE = 4
COMBAT_FIREDAMAGE = 8
COMBAT_UNDEFINEDDAMAGE = 16
COMBAT_LIFEDRAIN = 32
COMBAT_MANADRAIN = 64
COMBAT_HEALING = 128
COMBAT_DROWNDAMAGE = 256
COMBAT_ICEDAMAGE = 512
COMBAT_HOLYDAMAGE = 1024
COMBAT_DEATHDAMAGE = 2048

- value = valor da mudança

quando está return false:
- O player ou o monstro não ganharão/perderão vida/mana no combat. Pode ser usado pra fazer ele ficar imortal por um certo período ou não ser capaz de tomar dano de certos players/creaturas

Registra creature event:

- Sim

type="statschange"
function onStatsChange(cid, attacker, type, combat, value)

DarkrausD
16 de fevereiro de 2016 às 03:51

Eu estava com uma aba do navegador aberta neste tutorial seu. era uma duvida de interpretação mesmo.

 

 

Se eu tentasse fazer esse script que foi pedido assim :

 

local storage1 = xxx

local chance = math.random(1,100))

onStatsChange(cid, attacker, 1, 1, VALUE)

 

if getPlayerStorageValue(cid) == storage1 then
if chance =<10 then
return false
elseif
return true
end
end
end

 

----------- edit2

 

fiz umas ediçoes para arrumar erros do script...

dê uma olhada:

local storage1 = xxx
local storage2 = yyy
local chance = math.random(1,100)
function onStatsChange(cid, attacker, type, combat, value)

	if getPlayerStorageValue(cid) == storage1 then
		if chance <= 10 then
		doSendAnimatedText(getPlayerPosition(cid), Blocked, 180)
		return false
		else
		return true
        end
	end
end

Editado Fevereiro 16 por Darkraus

Night WolfN
16 de fevereiro de 2016 às 04:52

hmm, foi quase mas faltou algumas pequenas coisas:

local storage1 = xxx

function onStatsChange(cid, attacker, type, combat, value) -- isso aqui é padrão, oque vc pode é brincar com os parametros aqui embaixo:
	if type == STATSCHANGE_HEALTHLOSS or (type == STATSCHANGE_MANALOSS and getCreatureCondition(cid, CONDITION_MANASHIELD)) then
		if getPlayerStorageValue(cid, storage) >= 1 then -- a função estava sendo usada de forma errada
			local chance = math.random(1,100) -- a chance tem que ficar dentro do callback pra ser calculada toda vez que ele for executado, do contrário
			-- ela só vai ser calculada uma vez e ser aquele valor pra sempre até o servidor resetar
			if chance <= 10 then
				return false
			end
		end
	end
return true
end


--- forma alternativa:
local storage1 = xxx

function onStatsChange(cid, attacker, type, combat, value) 
	if type == STATSCHANGE_HEALTHLOSS or (type == STATSCHANGE_MANALOSS and getCreatureCondition(cid, CONDITION_MANASHIELD)) then
		if getPlayerStorageValue(cid, storage) >= 1 and math.random(1,100) <= 10 then 
			return false
		end
	end
return true
end
DarkrausD
16 de fevereiro de 2016 às 05:13

		if getPlayerStorageValue(cid, storage) >= 1 and math.random(1,100) <= 10 then 

nossa, a função é completamente diferente do que eu pensei que fosse... acreditava que a função deveria retornar o valor.

mas aparentemente ela retorna se é verdadeiro ou não a igualdade...

mas fiquei com uma duvida:

 

se ">= 1" indica que "o player possui aquele storage.

"<=0" indicaria que o player não possui aquele storage?

 

por exemplo, supondo que eu precise fazer um script que a condição é justamente o contrario.

somente o jogador que tivesse o storage não pudesse participar. eu usaria:

if getPlayerStorageValue(cid, storage) == 0?

ou

if getPlayerStorageValue(cid, storage) <= 0?

não fui eu quem pedi o script porém, me serviu de aula haha.

obrigado Wolf.

( não testei o script, não posso dizer se funciona ou não )

Night WolfN
16 de fevereiro de 2016 às 05:42

getPlayerStorageValue -- pegar o valor de determinado storage.

O valor padrão pra todos os storages é -1, mas por convenção use sempre <= 0 e >= 1

DarkrausD
16 de fevereiro de 2016 às 05:59

Genial, obrigado por esclarecer essas duvidas...

quando o autor do topico voltar acredito q ele confirmará a funcionalidade do script.

 

eu fiz um teste rapido, removi a linha que verifica o storage e o adicionei como creaturescripts em um monstro para teste.

o script cumpre o que foi proposto, ele bloquea um dano. simples, tentei deixa-lo mais bonito usando

 

doSendAnimatedText(getCreaturePosition(cid), Blocked, 180).

 

mas por algum motivo não reconhece, enfim.

Obrigado pela ajuda.

Wolf Rep +