
Tadelho
Membro
-
Registro em
-
Última visita
Histórico de Curtidas
-
Tadelho recebeu reputação de davidls em (Resolvido)DOUBLE HIT NA ARMA@OmegaZero
Cara, eu não sei qual a versão de servidor que você está utilizando. Eu vou te fazer aqui um script para TFS 0.4.0, é bem simples.
Crie um arquivo .lua na pasta ...weapons/scripts (escolha o nome do arquivo, ex: "script.lua")
Dentro do arquivo insira o seguinte código:
Explicando o script: toda vez que você atacar com a arma, ele irá sortear um número de 1 a 100. Se este número for maior que a chance que você determinou, o ataque ocorrerá normalmente. Se for menor, a arma fará um ataque adicional 500 milissegundos depois do primeiro (ataque duplo).
Agora vá em weapons.xml e registre este script na arma que você quer que tenha esse comportamento. Ex:
Obs: melee id = o ID number da arma que você quer.
Para TFS 0.4.0 é isso. Se você estiver usando outra versão, não saberei ajudar.
-
Tadelho recebeu reputação de Lurk em Alvos específicos em spells de área!Conforme tive uma dúvida outro dia, consegui obter uma solução satisfatória e, sabendo que pode ser a dúvida de mais gente, resolvi compartilhar na forma deste pequeno tutorial.
A ideia é muito simples: fazer com que uma spell de área atinga apenas alguns alvos conforme uma característica específica. Isso pode ser bastante útil para diversas ideias, além do script base servir para tantos outros efeitos interessantes.
Atenção, fiz os scripts para: TFS 0.4.0
Teremos como base para esse exemplo a magia "divine caldera", o famoso "exevo mas san".
Nela teremos o seguinte script:
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HOLYAREA) setAttackFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 4, 6) local area = createCombatArea(AREA_CIRCLE3X3) setCombatArea(combat, area) function onCastSpell(cid, var) return doCombat(cid, combat, var) end
Desta forma, a magia atingirá todos os alvos em sua área de alcance. Mas queremos mudar isso, queremos que ela atinja alvos específicos, e aqui entram algumas ideias, por exemplo: podemos fazer com que ela acerte apenas players de um determinado level, players de uma determinada vocação, players com um determinado access, ou mesmo uma storage, ou ainda, como no exemplo que darei a seguir, fazer com que a magia acerte apenas alvos com um determinado nome (no caso, serão criaturas e não players).
Para isso, utilizaremos uma função, "onTargetCreature(cid, target)" e depois a chamaremos como parâmetro de um "setCombatCallback(combat, key, function_name)".
Na função onTargetCreature nós faremos a verificação desejada. Por exemplo, no código a seguir eu quero que a minha spell atinja apenas criaturas com o nome de "rat" ou "cave rat", então ficaria assim:
function onTargetCreature(cid, target) local creatures = {"rat", "cave rat"} if isMonster(target) and isInArray(creatures, getCreatureName(target)) then doTargetCombatHealth(cid, target, type, min, max, effect) end end Traduzindo: eu criei uma tabela local com os nomes desejados, verifiquei se o alvo era um monstro e se o nome do monstro constava na minha tabela recém criada. Sendo verdadeiro, acionei a função doTargetCombatHealth(cid, target, type, min, max, effect). -- Lembrando que conforme o tipo da sua magia você vai alterar os parâmetros dessa função para que ela tenha as animações e o dano compatíveis com o seu gosto/objetivo.
Outro detalhe é que nesse trecho de código acima é que é feita a verificação que eu desejo. Eu poderia ao invés disso verificar se é um jogador e se a vocação dele tem o id 1 ou 2, por exemplo. Ficaria:
function onTargetCreature(cid, target) local vocations = {1, 2} if isPlayer(target) and isInArray(vocations, getPlayerVocation(target)) then doTargetCombatHealth(cid, target, type, min, max, effect) end end Ou verificar um level, para que a magia só funcione em alvos acima do level X, etc. Exemplo:
function onTargetCreature(cid, target) local level = 80 if isPlayer(target) and getPlayerLevel(target) >= 80 then doTargetCombatHealth(cid, target, type, min, max, effect) end end
Feita a função, faremos aquilo que mencionei: a chamaremos como parâmetro da função "setCombatCallback" para o nosso "combat". Fica assim:
setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature")
Feito isso, pronto! Basta chamarmos a spell normalmente.
Exemplo de tudo pronto para uma magia "exevo mas san" que só acerte os ratos e tira de 10 a 20 de vida:
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HOLYAREA) local area = createCombatArea(AREA_CIRCLE3X3) setCombatArea(combat, area) function onTargetCreature(cid, target) local creatures = {"rat", "cave rat"} if isMonster(target) and isInArray(creatures, getCreatureName(target)) then doTargetCombatHealth(cid, target, COMBAT_HOLYDAMAGE, -10, -20, CONST_ME_HOLYAREA) end end setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature") function onCastSpell(cid, var) return doCombat(cid, combat, var) end Agora é com a criatividade de vocês!
Até a próxima!
-
Tadelho recebeu reputação de XGaduX em (Resolvido)Sistema de Dodge sem item@Guilherme HP , vou te dar uma ideia adaptando um script que uso no meu servidor.
Crie um creaturescript chamado "playerdodge.lua", por exemplo. (o nome você escolhe). Nele, vamos montar um script que, sempre que o jogador for receber um dano, fará uma verificação afim de anular ou não o dano recebido. O script ficaria mais ou menos como:
local dodgechance = 20 -- chance em % do sistema dodge funcionar local multiplier = 0 -- valor pelo qual o dano será multiplicado function onStatsChange(cid, attacker, type, combat, value) if type == STATSCHANGE_HEALTHLOSS then if isPlayer(attacker) or isCreature(attacker) then if dodgechance >= math.random (0, 100) then value = math.ceil(value*multiplier) doTargetCombatHealth(attacker, cid, combat, -value, -value, 255) doSendAnimatedText(getCreaturePos(cid), "Dodge", 19) return false end end end return true end Explicando o script: a variável "dodgechance" determinará em quantos % das vezes o golpe cairá na condição de ser anulado. Fiz em base centesimal (baseado em uma divisão por 100), mas isso pode ser mudado conforme o gosto do usuário.
A variável "multiplier" dirá por quanto o dano que seria recebido será multiplicado, isto é, se deixarmos o valor em "1", o dano será recebido integralmente. Para o valor "2", receberíamos o dano em dobro. Como queremos anular o dano por completo, vamos multiplicar por "0".
A seguir, a função onStatsChange fará a verificação sempre que houver uma alteração no status do personagem; no caso, sempre que ele perca vida, para que possamos anular o dano vindo de criaturas e jogadores e tenhamos o resultado que você pediu. Dentro dela temos a verificação matemática da chance, a atualização do dano e a aplicação do mesmo. Ao final, a mensagem também está configurada como "Dodge", mas você pode alterar se quiser.
--
Feito isso, você deverá registrar esse creatuerscript em todos os players. Faremos da seguinte maneira: no creaturescripts.xml, adicione o evento para que seja reconhecido.
<event type="statschange" name="playerdodge" event="script" value="playerdodge.lua"/>
Obs: preencha em "value" o nome do arquivo.lua que você escolhe lá em cima.
Agora basta registrar o evento nos jogadores. Há algumas formas de fazer isso, uma fácil é registrar todos os players assim que fizerem o login.
Ainda na pasta creaturescripts/scripts, vá em login.lua e dentro da função onLogin(cid) adicione o código;
registerCreatureEvent(cid, "playerdodge") Obs: o nome entre aspas deverá ser o mesmo nome que você colocou como valor de "name" no arquivo creaturescripts.xml.
Pronto, está feito.
-
Tadelho recebeu reputação de Guilherme HP em (Resolvido)Sistema de Dodge sem item@Guilherme HP , vou te dar uma ideia adaptando um script que uso no meu servidor.
Crie um creaturescript chamado "playerdodge.lua", por exemplo. (o nome você escolhe). Nele, vamos montar um script que, sempre que o jogador for receber um dano, fará uma verificação afim de anular ou não o dano recebido. O script ficaria mais ou menos como:
local dodgechance = 20 -- chance em % do sistema dodge funcionar local multiplier = 0 -- valor pelo qual o dano será multiplicado function onStatsChange(cid, attacker, type, combat, value) if type == STATSCHANGE_HEALTHLOSS then if isPlayer(attacker) or isCreature(attacker) then if dodgechance >= math.random (0, 100) then value = math.ceil(value*multiplier) doTargetCombatHealth(attacker, cid, combat, -value, -value, 255) doSendAnimatedText(getCreaturePos(cid), "Dodge", 19) return false end end end return true end Explicando o script: a variável "dodgechance" determinará em quantos % das vezes o golpe cairá na condição de ser anulado. Fiz em base centesimal (baseado em uma divisão por 100), mas isso pode ser mudado conforme o gosto do usuário.
A variável "multiplier" dirá por quanto o dano que seria recebido será multiplicado, isto é, se deixarmos o valor em "1", o dano será recebido integralmente. Para o valor "2", receberíamos o dano em dobro. Como queremos anular o dano por completo, vamos multiplicar por "0".
A seguir, a função onStatsChange fará a verificação sempre que houver uma alteração no status do personagem; no caso, sempre que ele perca vida, para que possamos anular o dano vindo de criaturas e jogadores e tenhamos o resultado que você pediu. Dentro dela temos a verificação matemática da chance, a atualização do dano e a aplicação do mesmo. Ao final, a mensagem também está configurada como "Dodge", mas você pode alterar se quiser.
--
Feito isso, você deverá registrar esse creatuerscript em todos os players. Faremos da seguinte maneira: no creaturescripts.xml, adicione o evento para que seja reconhecido.
<event type="statschange" name="playerdodge" event="script" value="playerdodge.lua"/>
Obs: preencha em "value" o nome do arquivo.lua que você escolhe lá em cima.
Agora basta registrar o evento nos jogadores. Há algumas formas de fazer isso, uma fácil é registrar todos os players assim que fizerem o login.
Ainda na pasta creaturescripts/scripts, vá em login.lua e dentro da função onLogin(cid) adicione o código;
registerCreatureEvent(cid, "playerdodge") Obs: o nome entre aspas deverá ser o mesmo nome que você colocou como valor de "name" no arquivo creaturescripts.xml.
Pronto, está feito.
-
Tadelho recebeu reputação de bpm91 em RP exausted andar e atacarCara, eu não sei qual servidor e qual versão você está utilizando, mas talvez a solução passe pelo mesmo método encontrado neste tópico que deixarei ao final; isto é, uma pequena edição no código fonte do seu servidor (que deverá ser compilado novamente a partir da modificação). Infelizmente eu não sei exatamente qual é o trecho de código que condiciona isso que você quer.
-
Tadelho recebeu reputação de caionak em Alvos específicos em spells de área!Conforme tive uma dúvida outro dia, consegui obter uma solução satisfatória e, sabendo que pode ser a dúvida de mais gente, resolvi compartilhar na forma deste pequeno tutorial.
A ideia é muito simples: fazer com que uma spell de área atinga apenas alguns alvos conforme uma característica específica. Isso pode ser bastante útil para diversas ideias, além do script base servir para tantos outros efeitos interessantes.
Atenção, fiz os scripts para: TFS 0.4.0
Teremos como base para esse exemplo a magia "divine caldera", o famoso "exevo mas san".
Nela teremos o seguinte script:
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HOLYAREA) setAttackFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 4, 6) local area = createCombatArea(AREA_CIRCLE3X3) setCombatArea(combat, area) function onCastSpell(cid, var) return doCombat(cid, combat, var) end
Desta forma, a magia atingirá todos os alvos em sua área de alcance. Mas queremos mudar isso, queremos que ela atinja alvos específicos, e aqui entram algumas ideias, por exemplo: podemos fazer com que ela acerte apenas players de um determinado level, players de uma determinada vocação, players com um determinado access, ou mesmo uma storage, ou ainda, como no exemplo que darei a seguir, fazer com que a magia acerte apenas alvos com um determinado nome (no caso, serão criaturas e não players).
Para isso, utilizaremos uma função, "onTargetCreature(cid, target)" e depois a chamaremos como parâmetro de um "setCombatCallback(combat, key, function_name)".
Na função onTargetCreature nós faremos a verificação desejada. Por exemplo, no código a seguir eu quero que a minha spell atinja apenas criaturas com o nome de "rat" ou "cave rat", então ficaria assim:
function onTargetCreature(cid, target) local creatures = {"rat", "cave rat"} if isMonster(target) and isInArray(creatures, getCreatureName(target)) then doTargetCombatHealth(cid, target, type, min, max, effect) end end Traduzindo: eu criei uma tabela local com os nomes desejados, verifiquei se o alvo era um monstro e se o nome do monstro constava na minha tabela recém criada. Sendo verdadeiro, acionei a função doTargetCombatHealth(cid, target, type, min, max, effect). -- Lembrando que conforme o tipo da sua magia você vai alterar os parâmetros dessa função para que ela tenha as animações e o dano compatíveis com o seu gosto/objetivo.
Outro detalhe é que nesse trecho de código acima é que é feita a verificação que eu desejo. Eu poderia ao invés disso verificar se é um jogador e se a vocação dele tem o id 1 ou 2, por exemplo. Ficaria:
function onTargetCreature(cid, target) local vocations = {1, 2} if isPlayer(target) and isInArray(vocations, getPlayerVocation(target)) then doTargetCombatHealth(cid, target, type, min, max, effect) end end Ou verificar um level, para que a magia só funcione em alvos acima do level X, etc. Exemplo:
function onTargetCreature(cid, target) local level = 80 if isPlayer(target) and getPlayerLevel(target) >= 80 then doTargetCombatHealth(cid, target, type, min, max, effect) end end
Feita a função, faremos aquilo que mencionei: a chamaremos como parâmetro da função "setCombatCallback" para o nosso "combat". Fica assim:
setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature")
Feito isso, pronto! Basta chamarmos a spell normalmente.
Exemplo de tudo pronto para uma magia "exevo mas san" que só acerte os ratos e tira de 10 a 20 de vida:
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HOLYAREA) local area = createCombatArea(AREA_CIRCLE3X3) setCombatArea(combat, area) function onTargetCreature(cid, target) local creatures = {"rat", "cave rat"} if isMonster(target) and isInArray(creatures, getCreatureName(target)) then doTargetCombatHealth(cid, target, COMBAT_HOLYDAMAGE, -10, -20, CONST_ME_HOLYAREA) end end setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature") function onCastSpell(cid, var) return doCombat(cid, combat, var) end Agora é com a criatividade de vocês!
Até a próxima!
-
Tadelho recebeu reputação de Bolletox em Alvos específicos em spells de área!Conforme tive uma dúvida outro dia, consegui obter uma solução satisfatória e, sabendo que pode ser a dúvida de mais gente, resolvi compartilhar na forma deste pequeno tutorial.
A ideia é muito simples: fazer com que uma spell de área atinga apenas alguns alvos conforme uma característica específica. Isso pode ser bastante útil para diversas ideias, além do script base servir para tantos outros efeitos interessantes.
Atenção, fiz os scripts para: TFS 0.4.0
Teremos como base para esse exemplo a magia "divine caldera", o famoso "exevo mas san".
Nela teremos o seguinte script:
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HOLYAREA) setAttackFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 4, 6) local area = createCombatArea(AREA_CIRCLE3X3) setCombatArea(combat, area) function onCastSpell(cid, var) return doCombat(cid, combat, var) end
Desta forma, a magia atingirá todos os alvos em sua área de alcance. Mas queremos mudar isso, queremos que ela atinja alvos específicos, e aqui entram algumas ideias, por exemplo: podemos fazer com que ela acerte apenas players de um determinado level, players de uma determinada vocação, players com um determinado access, ou mesmo uma storage, ou ainda, como no exemplo que darei a seguir, fazer com que a magia acerte apenas alvos com um determinado nome (no caso, serão criaturas e não players).
Para isso, utilizaremos uma função, "onTargetCreature(cid, target)" e depois a chamaremos como parâmetro de um "setCombatCallback(combat, key, function_name)".
Na função onTargetCreature nós faremos a verificação desejada. Por exemplo, no código a seguir eu quero que a minha spell atinja apenas criaturas com o nome de "rat" ou "cave rat", então ficaria assim:
function onTargetCreature(cid, target) local creatures = {"rat", "cave rat"} if isMonster(target) and isInArray(creatures, getCreatureName(target)) then doTargetCombatHealth(cid, target, type, min, max, effect) end end Traduzindo: eu criei uma tabela local com os nomes desejados, verifiquei se o alvo era um monstro e se o nome do monstro constava na minha tabela recém criada. Sendo verdadeiro, acionei a função doTargetCombatHealth(cid, target, type, min, max, effect). -- Lembrando que conforme o tipo da sua magia você vai alterar os parâmetros dessa função para que ela tenha as animações e o dano compatíveis com o seu gosto/objetivo.
Outro detalhe é que nesse trecho de código acima é que é feita a verificação que eu desejo. Eu poderia ao invés disso verificar se é um jogador e se a vocação dele tem o id 1 ou 2, por exemplo. Ficaria:
function onTargetCreature(cid, target) local vocations = {1, 2} if isPlayer(target) and isInArray(vocations, getPlayerVocation(target)) then doTargetCombatHealth(cid, target, type, min, max, effect) end end Ou verificar um level, para que a magia só funcione em alvos acima do level X, etc. Exemplo:
function onTargetCreature(cid, target) local level = 80 if isPlayer(target) and getPlayerLevel(target) >= 80 then doTargetCombatHealth(cid, target, type, min, max, effect) end end
Feita a função, faremos aquilo que mencionei: a chamaremos como parâmetro da função "setCombatCallback" para o nosso "combat". Fica assim:
setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature")
Feito isso, pronto! Basta chamarmos a spell normalmente.
Exemplo de tudo pronto para uma magia "exevo mas san" que só acerte os ratos e tira de 10 a 20 de vida:
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HOLYAREA) local area = createCombatArea(AREA_CIRCLE3X3) setCombatArea(combat, area) function onTargetCreature(cid, target) local creatures = {"rat", "cave rat"} if isMonster(target) and isInArray(creatures, getCreatureName(target)) then doTargetCombatHealth(cid, target, COMBAT_HOLYDAMAGE, -10, -20, CONST_ME_HOLYAREA) end end setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature") function onCastSpell(cid, var) return doCombat(cid, combat, var) end Agora é com a criatividade de vocês!
Até a próxima!
-
Tadelho recebeu reputação de Ackerzin em Alvos específicos em spells de área!Conforme tive uma dúvida outro dia, consegui obter uma solução satisfatória e, sabendo que pode ser a dúvida de mais gente, resolvi compartilhar na forma deste pequeno tutorial.
A ideia é muito simples: fazer com que uma spell de área atinga apenas alguns alvos conforme uma característica específica. Isso pode ser bastante útil para diversas ideias, além do script base servir para tantos outros efeitos interessantes.
Atenção, fiz os scripts para: TFS 0.4.0
Teremos como base para esse exemplo a magia "divine caldera", o famoso "exevo mas san".
Nela teremos o seguinte script:
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HOLYAREA) setAttackFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 4, 6) local area = createCombatArea(AREA_CIRCLE3X3) setCombatArea(combat, area) function onCastSpell(cid, var) return doCombat(cid, combat, var) end
Desta forma, a magia atingirá todos os alvos em sua área de alcance. Mas queremos mudar isso, queremos que ela atinja alvos específicos, e aqui entram algumas ideias, por exemplo: podemos fazer com que ela acerte apenas players de um determinado level, players de uma determinada vocação, players com um determinado access, ou mesmo uma storage, ou ainda, como no exemplo que darei a seguir, fazer com que a magia acerte apenas alvos com um determinado nome (no caso, serão criaturas e não players).
Para isso, utilizaremos uma função, "onTargetCreature(cid, target)" e depois a chamaremos como parâmetro de um "setCombatCallback(combat, key, function_name)".
Na função onTargetCreature nós faremos a verificação desejada. Por exemplo, no código a seguir eu quero que a minha spell atinja apenas criaturas com o nome de "rat" ou "cave rat", então ficaria assim:
function onTargetCreature(cid, target) local creatures = {"rat", "cave rat"} if isMonster(target) and isInArray(creatures, getCreatureName(target)) then doTargetCombatHealth(cid, target, type, min, max, effect) end end Traduzindo: eu criei uma tabela local com os nomes desejados, verifiquei se o alvo era um monstro e se o nome do monstro constava na minha tabela recém criada. Sendo verdadeiro, acionei a função doTargetCombatHealth(cid, target, type, min, max, effect). -- Lembrando que conforme o tipo da sua magia você vai alterar os parâmetros dessa função para que ela tenha as animações e o dano compatíveis com o seu gosto/objetivo.
Outro detalhe é que nesse trecho de código acima é que é feita a verificação que eu desejo. Eu poderia ao invés disso verificar se é um jogador e se a vocação dele tem o id 1 ou 2, por exemplo. Ficaria:
function onTargetCreature(cid, target) local vocations = {1, 2} if isPlayer(target) and isInArray(vocations, getPlayerVocation(target)) then doTargetCombatHealth(cid, target, type, min, max, effect) end end Ou verificar um level, para que a magia só funcione em alvos acima do level X, etc. Exemplo:
function onTargetCreature(cid, target) local level = 80 if isPlayer(target) and getPlayerLevel(target) >= 80 then doTargetCombatHealth(cid, target, type, min, max, effect) end end
Feita a função, faremos aquilo que mencionei: a chamaremos como parâmetro da função "setCombatCallback" para o nosso "combat". Fica assim:
setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature")
Feito isso, pronto! Basta chamarmos a spell normalmente.
Exemplo de tudo pronto para uma magia "exevo mas san" que só acerte os ratos e tira de 10 a 20 de vida:
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HOLYAREA) local area = createCombatArea(AREA_CIRCLE3X3) setCombatArea(combat, area) function onTargetCreature(cid, target) local creatures = {"rat", "cave rat"} if isMonster(target) and isInArray(creatures, getCreatureName(target)) then doTargetCombatHealth(cid, target, COMBAT_HOLYDAMAGE, -10, -20, CONST_ME_HOLYAREA) end end setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature") function onCastSpell(cid, var) return doCombat(cid, combat, var) end Agora é com a criatividade de vocês!
Até a próxima!
-
Tadelho recebeu reputação de KotZletY em Alvos específicos em spells de área!Conforme tive uma dúvida outro dia, consegui obter uma solução satisfatória e, sabendo que pode ser a dúvida de mais gente, resolvi compartilhar na forma deste pequeno tutorial.
A ideia é muito simples: fazer com que uma spell de área atinga apenas alguns alvos conforme uma característica específica. Isso pode ser bastante útil para diversas ideias, além do script base servir para tantos outros efeitos interessantes.
Atenção, fiz os scripts para: TFS 0.4.0
Teremos como base para esse exemplo a magia "divine caldera", o famoso "exevo mas san".
Nela teremos o seguinte script:
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HOLYAREA) setAttackFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 4, 6) local area = createCombatArea(AREA_CIRCLE3X3) setCombatArea(combat, area) function onCastSpell(cid, var) return doCombat(cid, combat, var) end
Desta forma, a magia atingirá todos os alvos em sua área de alcance. Mas queremos mudar isso, queremos que ela atinja alvos específicos, e aqui entram algumas ideias, por exemplo: podemos fazer com que ela acerte apenas players de um determinado level, players de uma determinada vocação, players com um determinado access, ou mesmo uma storage, ou ainda, como no exemplo que darei a seguir, fazer com que a magia acerte apenas alvos com um determinado nome (no caso, serão criaturas e não players).
Para isso, utilizaremos uma função, "onTargetCreature(cid, target)" e depois a chamaremos como parâmetro de um "setCombatCallback(combat, key, function_name)".
Na função onTargetCreature nós faremos a verificação desejada. Por exemplo, no código a seguir eu quero que a minha spell atinja apenas criaturas com o nome de "rat" ou "cave rat", então ficaria assim:
function onTargetCreature(cid, target) local creatures = {"rat", "cave rat"} if isMonster(target) and isInArray(creatures, getCreatureName(target)) then doTargetCombatHealth(cid, target, type, min, max, effect) end end Traduzindo: eu criei uma tabela local com os nomes desejados, verifiquei se o alvo era um monstro e se o nome do monstro constava na minha tabela recém criada. Sendo verdadeiro, acionei a função doTargetCombatHealth(cid, target, type, min, max, effect). -- Lembrando que conforme o tipo da sua magia você vai alterar os parâmetros dessa função para que ela tenha as animações e o dano compatíveis com o seu gosto/objetivo.
Outro detalhe é que nesse trecho de código acima é que é feita a verificação que eu desejo. Eu poderia ao invés disso verificar se é um jogador e se a vocação dele tem o id 1 ou 2, por exemplo. Ficaria:
function onTargetCreature(cid, target) local vocations = {1, 2} if isPlayer(target) and isInArray(vocations, getPlayerVocation(target)) then doTargetCombatHealth(cid, target, type, min, max, effect) end end Ou verificar um level, para que a magia só funcione em alvos acima do level X, etc. Exemplo:
function onTargetCreature(cid, target) local level = 80 if isPlayer(target) and getPlayerLevel(target) >= 80 then doTargetCombatHealth(cid, target, type, min, max, effect) end end
Feita a função, faremos aquilo que mencionei: a chamaremos como parâmetro da função "setCombatCallback" para o nosso "combat". Fica assim:
setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature")
Feito isso, pronto! Basta chamarmos a spell normalmente.
Exemplo de tudo pronto para uma magia "exevo mas san" que só acerte os ratos e tira de 10 a 20 de vida:
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HOLYAREA) local area = createCombatArea(AREA_CIRCLE3X3) setCombatArea(combat, area) function onTargetCreature(cid, target) local creatures = {"rat", "cave rat"} if isMonster(target) and isInArray(creatures, getCreatureName(target)) then doTargetCombatHealth(cid, target, COMBAT_HOLYDAMAGE, -10, -20, CONST_ME_HOLYAREA) end end setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature") function onCastSpell(cid, var) return doCombat(cid, combat, var) end Agora é com a criatividade de vocês!
Até a próxima!
-
Tadelho recebeu reputação de leozincorsair em (Resolvido)Ajudar a colocar porcentagem nesse script!Sim, eu entendi isso. O problema é que com essa disposição de 50%-30%-10%, em 10% das vezes não acontecerá do jogador ganhar qualquer um dos itens listados. Mesmo que o sorteio dos itens seja independente, ainda há o risco também de nenhum dos itens ser sorteado, então eu assumi que ele simplesmente perderá em 10% das vezes. @leozincorsair
Sorteio para ganhar um item ou outro, 1° script.
Sorteio independente de cada item, 2° script.
-- CONFIGURAÇÕES -- PR = {11413, 11414, 11467} -- ID dos itens que será sorteado. money = {9970, 'Royal Coins'} -- ID do crystal coin e nome. count = 50 -- Quantidade de dinheiro. cast = "[Cassino]" function onUse(cid, item, fromPosition, itemEx, toPosition) local chance = math.random(1,100) local CB = { doSendAnimatedText, doSendMagicEffect, doPlayerAddItem, doPlayerRemoveItem} if not CB[4](cid, money[1], count) then doPlayerSendCancel(cid, "Você precisa de "..count.." "..money[2].." pra apostar.") CB[2](getThingPos(cid), CONST_ME_POFF) else if chance <= 50 then CB[3](cid, PR[1], 2) doBroadcastMessage(""..cast.." Você Obteve um "..getItemNameById(PR[1]).."", 22) elseif chance > 50 and <= 80 then CB[3](cid, PR[2], 1) doBroadcastMessage(""..cast.." Você Obteve um "..getItemNameById(PR[2]).."", 22) elseif chance > 80 and <= 90 then CB[3](cid, PR[3], 1) doBroadcastMessage(""..cast.." Você Obteve um "..getItemNameById(PR[3]).."", 22) elseif chance > 90 then doBroadcastMessage(""..cast.." Você perdeu sua aposta.", 22) return TRUE end return TRUE end -- CONFIGURAÇÕES -- PR = {11413, 11414, 11467} -- ID dos itens que será sorteado. money = {9970, 'Royal Coins'} -- ID do crystal coin e nome. count = 50 -- Quantidade de dinheiro. cast = "[Cassino]" function onUse(cid, item, fromPosition, itemEx, toPosition) local chance1, chance2, chance3 = math.random(1,100) local CB = { doSendAnimatedText, doSendMagicEffect, doPlayerAddItem, doPlayerRemoveItem} if not CB[4](cid, money[1], count) then doPlayerSendCancel(cid, "Você precisa de "..count.." "..money[2].." pra apostar.") CB[2](getThingPos(cid), CONST_ME_POFF) else if chance1 <= 50 then CB[3](cid, PR[1], 2) doBroadcastMessage(""..cast.." Você Obteve um "..getItemNameById(PR[1]).."", 22) end if chance2 <= 30 then CB[3](cid, PR[2], 1) doBroadcastMessage(""..cast.." Você Obteve um "..getItemNameById(PR[2]).."", 22) end if chance3 <= 10 then CB[3](cid, PR[3], 1) doBroadcastMessage(""..cast.." Você Obteve um "..getItemNameById(PR[3]).."", 22) end if chance1 > 50 and chance2 > 30 and chance3 > 10 then doBroadcastMessage(""..cast.." Você perdeu sua aposta.", 22) end return TRUE end return TRUE end -
Tadelho deu reputação a DukeeH em (AJUDA) vocação de cria items por certos items<instant name="Criar item" words="criaritem" lvl="50" mana="50" aggressive="0" selftarget="1" exhaustion="800" groups="3,800" needlearn="0" event="script" value="criaritem.lua"> <vocation id="1"/> <vocation id="5"/> </instant> function onCastSpell(cid, var) local itensqueprecisa = { [1] = {itemID = 111111, itemCount = 1111}, [2] = {itemID = 111111, itemCount = 1111}, [3] = {itemID = 111111, itemCount = 1111} } local itensquerecebe = { item_ID = 111111, item_count = 1111 } count = 0 for i = 1, #itensqueprecisa do if getPlayerItemCount(cid, itensqueprecisa[i].itemID) >= itensqueprecisa[i].itemCount then count = count + 1 else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You require more ".. getItemNameById(itensqueprecisa[i].itemID) .."'s to successfully convert items.") break end end table_count = 0 for k,v in pairs(itensqueprecisa) do table_count = table_count + 1 end if table_count ~= count then return true end for i = 1, #itensqueprecisa do doPlayerRemoveItem(cid, itensqueprecisa[i].itemID, itensqueprecisa[i].itemCount) end stack = 0 if isItemStackable(itensquerecebe.item_ID) == true then stack = stack + 1 end if stack == 1 then doPlayerAddItem(cid, itensquerecebe.item_ID, itensquerecebe.item_count, true) else repeat doPlayerAddItem(cid, itensquerecebe.item_ID, 1, true) stack = stack + 1 until stack == (itensquerecebe.item_count) end doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You have received ".. itensquerecebe.item_count .." ".. getItemNameById(itensquerecebe.item_ID) ..".") doPlayerAddExp(cid, 20) doSendMagicEffect(getThingPosition(cid), CONST_ME_MAGIC_GREEN) return true end
-
Tadelho recebeu reputação de lordzetros em (Resolvido)GlobalStorages ou Storage para players@Vodkart , exatamente. Só descobri isso porque executei um serversave, até então eu não tinha recebido qualquer mensagem de erro.
Consegui resolver, aparentemente! Eu simplesmente adicionei a coluna "world_id" na tabela "global_storage" e agora está funcionando. Fechei e abri o servidor e agora o script original funciona da maneira esperada e novos jogadores não ativam mais o script. O evento ocorre apenas uma vez!
Ficou assim:
Obrigado a todos que deram atenção ao tópico! O problema não era no script, mas sim no meu database.
Obs: eu coloquei o valor padrão do world_id como "0" porque este é valor configurado no meu config.lua. Se alguém que estiver lendo isso utilizar um valor diferente, terá de adaptar.
-
Tadelho recebeu reputação de Vodkart em (Resolvido)GlobalStorages ou Storage para players@Vodkart , exatamente. Só descobri isso porque executei um serversave, até então eu não tinha recebido qualquer mensagem de erro.
Consegui resolver, aparentemente! Eu simplesmente adicionei a coluna "world_id" na tabela "global_storage" e agora está funcionando. Fechei e abri o servidor e agora o script original funciona da maneira esperada e novos jogadores não ativam mais o script. O evento ocorre apenas uma vez!
Ficou assim:
Obrigado a todos que deram atenção ao tópico! O problema não era no script, mas sim no meu database.
Obs: eu coloquei o valor padrão do world_id como "0" porque este é valor configurado no meu config.lua. Se alguém que estiver lendo isso utilizar um valor diferente, terá de adaptar.
-
Tadelho recebeu reputação de luanluciano93 em (Resolvido)GlobalStorages ou Storage para players@Vodkart , exatamente. Só descobri isso porque executei um serversave, até então eu não tinha recebido qualquer mensagem de erro.
Consegui resolver, aparentemente! Eu simplesmente adicionei a coluna "world_id" na tabela "global_storage" e agora está funcionando. Fechei e abri o servidor e agora o script original funciona da maneira esperada e novos jogadores não ativam mais o script. O evento ocorre apenas uma vez!
Ficou assim:
Obrigado a todos que deram atenção ao tópico! O problema não era no script, mas sim no meu database.
Obs: eu coloquei o valor padrão do world_id como "0" porque este é valor configurado no meu config.lua. Se alguém que estiver lendo isso utilizar um valor diferente, terá de adaptar.
-
Tadelho deu reputação a Vodkart em (Resolvido)GlobalStorages ou Storage para playersQue estranho, parece que não existe essa coluna.
-
Tadelho deu reputação a Vodkart em (Resolvido)GlobalStorages ou Storage para playersexecuta essa query:
CREATE TABLE npc_quest ( create INT NOT NULL DEFAULT 0, PRIMARY KEY ( id ) );
e usa o script assim:
local pos = {x=875,y=398,z=7} -- Local do NPC local npc = "GoblinAssustadoOesteCidade" function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor) if isPlayer(cid) and getPlayerAccess(cid) < 3 then if db.getResult("SELECT `create` FROM `npc_quest`;"):getDataInt("create") <= 0 then doCreateNpc(npc, pos) db.executeQuery("UPDATE `npc_quest` SET `create` = 1;") end end return true end
futuramente, quando for "remover o npc usa esta linha para voltar para 0
db.executeQuery("UPDATE `npc_quest` SET `create` = 0;")
-------------------------------------------------------------
ai para dar sequencia a sua quest, e se ele tiver aparecido alguma vez na vida, você usa assim:
if db.getResult("SELECT `create` FROM `npc_quest`;"):getDataInt("create") > 0 then -- sim o npc ja foi criado alguma vez end
-----------------------------------------------------------------------------------------------
@Tadelho
Conseguiu? fiz exatamente o que descreveu... aguardo respostas!
-
Tadelho recebeu reputação de Vodkart em (Resolvido)GlobalStorages ou Storage para players@Vodkart, se você puder, leia a resposta anterior que deixei. Eu preciso registrar o evento do NPC ter aparecido alguma vez para seguir uma quest válida para todos os players. Não estou tendo problemas em duplicar o NPC nem nada. Enquanto o servidor está rodando o script funciona perfeitamente conforme o planejado. O problema é que ao fechar/reiniciar o servidor a globalstorage perde o valor e aí tudo recomeça, o que eu não quero que aconteça. Para solucionar isso eu preciso ou manter o valor da globalstorage, que eu não sei por que diabos some, ou atualizar o valor de uma storage dos players (o que consumiria mais processamento e memória, mas estou disposto a tentar ).
Edit: vou deixar de lado o código e explicar com palavras a mecânica esperada. Talvez ajude.
-> Se o NPC ainda não apareceu na história do servidor, um jogador pode fazê-lo aparecer ao pisar em um sqm.
-> Se o NPC já apareceu alguma vez na história, ele não deve aparecer jamais, em hipótese alguma, mesmo que o servidor seja reiniciado e etc.
Para solucionar isso eu imaginei que a globalstorage servisse, ou um registro geral em todos os players.
-
Tadelho deu reputação a lordzetros em (Resolvido)GlobalStorages ou Storage para players@Tadelho Estranho, nunca vi esse caso do globalStorage não salvar, eu ia recomendar dá uma olhada no config.lua, mas como você já disse que alterou para true, já deveria está funcionando.
Em questão de alterar o storage, o mais viável para se fazer isso seria atualizando pela database, já que nem todos os jogadores estariam online. Daqui a pouco penso em uma solução para isso.
-
Tadelho recebeu reputação de Coul em Armas para Players e Criaturas Específicas TFS 0.4.0Salve, pessoas.
Recentemente criei esse script para meu servidor particular e, embora simples, dá uma margem legal para a criatividade de vocês. Trata-se de um script para dar uma função especial a uma weapon qualquer do seu servidor quando você enfrenta uma criatura específica (ou mesmo um tipo de criatura).
Para isso utilizarmos uma função que pega o nome da criatura que você está atacando e verifica se ela pertence à sua tabela de verificação. Caso positivo, sua arma agirá de um modo diferente contra essa criatura específica.
O feitio é simples: criar um script no diretório .../weapons/scripts com o nome à sua escolha. Ex: "nome.lua"
Darei primeiro o conteúdo do meu script como exemplo:
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat, COMBAT_PARAM_BLOCKSHIELD, 1) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatFormula(combat, COMBAT_FORMULA_SKILL, 1.0, 0, 1.0, 0) local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat2, COMBAT_PARAM_BLOCKSHIELD, 1) setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatFormula(combat2, COMBAT_FORMULA_SKILL, 2.0, 0, 2.0, 0) local creatures = {"x", "y", "z"} function onUseWeapon(cid, var) local target = getCreatureTarget(cid) local nome = getCreatureName(target) if (not isInArray (creatures, nome)) then doCombat(cid, combat, var) else doCombat(cid, combat2, var) end end
Explicando o código: combat e combat2 são, respectivamente, os diferentes efeitos que eu desejo que minha arma tenha, e aqui podemos configurar uma série de possibilidades diferentes.
No caso, "combat" está configurado para que seja uma arma normal como qualquer outra.
O "combat2" está configurado para que esta arma dê um dano x2 (listado na fórmula)
Obs: nesta parte podemos brincar com as fórmulas e o tipo de dano conforme o gosto. Podemos adicionar um efeito secundário de algum elemento, como fogo, gelo, ou mesmo um lifedrain. Só não se esqueça de balancear a fórmula.
IMPORTANTE: "Creatures" é onde vou listar as criaturas para as quais quero que minha arma tenha um comportamento diferente, separadas por vírgula.
Dentro da função onUseWeapon temos um código que será executado ao utilizarmos a arma em questão para um ataque. Em "target" verificamos qual a criatura alvo do meu ataque, em seguida "nome" recebe o valor do nome da criatura em questão e temos uma condicional (if) que verifica se o nome da criatura que estamos atacando está inserida em "Creatures". Caso não esteja, ela assumirá o comportamento de "combat", ou seja, será uma arma com a fórmula e dano físico padrão do servidor; caso o nome esteja na minha lista especial, a arma assumirá "Combar2" e terá uma fórmula de dano x2, será uma arma poderosa contra essa criatura listada.
Uma vez feito o script, não se esqueça de registrá-lo na arma de sua preferência no weapons.xml.
Ex:
<melee id="2397" event="script" value="nome.lua">
Algumas ideias de como você pode utilizar a base do código:
- Quests e bosses; podemos fazer um boss que só seja derrotado com uma arma específica, por exemplo.
- Podemos brincar com mais recursos, como getPlayerVocation ou getPlayerLevel e com mais condicionais fazer armas que só liberem seu poder oculto nas mãos de alguma vocação, em um certo level, contra um tipo de criatura, etc.
- Eu utilizei no meu servidor que é baseado em Dungeons & Dragons para fazer com que mortos vivos tomem dano integral de ataques com club mas tomem metade do dano contra ataques de sword/axe (neste universo mortos-vivos são melhor esmagados do que cortados ou perfurados).
Enfim, um exemplo prático: crio uma quest com a recompensa de uma espada conhecida por "exterminar dragões". Registro no weapons.xml esta arma com um script.lua do meu gosto, como:
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat, COMBAT_PARAM_BLOCKSHIELD, 1) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatFormula(combat, COMBAT_FORMULA_SKILL, 1.0, 0, 1.0, 0) local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_LIFEDRAIN) setCombatParam(combat2, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_RED) setCombatFormula(combat2, COMBAT_FORMULA_SKILL, 0, -60, 0, -90) local creatures = {"Dragon", "Dragon Lord", "Frost Dragon"} function onUseWeapon(cid, var) local target = getCreatureTarget(cid) local nome = getCreatureName(target) if (not isInArray (creatures, nome)) then doCombat(cid, combat, var) else doCombat(cid, combat, var) doCombat(cid, combat2, var) end end Neste caso coloquei para, no caso de ser um dos dragões listados, ocorrer tanto o combat como o combat2, ou seja, a espada não só atacar como também drenar uma certa quantidade de vida da criatura (60-90). E no resto do tempo, ela será uma espada normal.
É isso ai, espero ter contribuído.
Até a próxima.
-
Tadelho recebeu reputação de Nandozeraah em Armas para Players e Criaturas Específicas TFS 0.4.0Salve, pessoas.
Recentemente criei esse script para meu servidor particular e, embora simples, dá uma margem legal para a criatividade de vocês. Trata-se de um script para dar uma função especial a uma weapon qualquer do seu servidor quando você enfrenta uma criatura específica (ou mesmo um tipo de criatura).
Para isso utilizarmos uma função que pega o nome da criatura que você está atacando e verifica se ela pertence à sua tabela de verificação. Caso positivo, sua arma agirá de um modo diferente contra essa criatura específica.
O feitio é simples: criar um script no diretório .../weapons/scripts com o nome à sua escolha. Ex: "nome.lua"
Darei primeiro o conteúdo do meu script como exemplo:
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat, COMBAT_PARAM_BLOCKSHIELD, 1) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatFormula(combat, COMBAT_FORMULA_SKILL, 1.0, 0, 1.0, 0) local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat2, COMBAT_PARAM_BLOCKSHIELD, 1) setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatFormula(combat2, COMBAT_FORMULA_SKILL, 2.0, 0, 2.0, 0) local creatures = {"x", "y", "z"} function onUseWeapon(cid, var) local target = getCreatureTarget(cid) local nome = getCreatureName(target) if (not isInArray (creatures, nome)) then doCombat(cid, combat, var) else doCombat(cid, combat2, var) end end
Explicando o código: combat e combat2 são, respectivamente, os diferentes efeitos que eu desejo que minha arma tenha, e aqui podemos configurar uma série de possibilidades diferentes.
No caso, "combat" está configurado para que seja uma arma normal como qualquer outra.
O "combat2" está configurado para que esta arma dê um dano x2 (listado na fórmula)
Obs: nesta parte podemos brincar com as fórmulas e o tipo de dano conforme o gosto. Podemos adicionar um efeito secundário de algum elemento, como fogo, gelo, ou mesmo um lifedrain. Só não se esqueça de balancear a fórmula.
IMPORTANTE: "Creatures" é onde vou listar as criaturas para as quais quero que minha arma tenha um comportamento diferente, separadas por vírgula.
Dentro da função onUseWeapon temos um código que será executado ao utilizarmos a arma em questão para um ataque. Em "target" verificamos qual a criatura alvo do meu ataque, em seguida "nome" recebe o valor do nome da criatura em questão e temos uma condicional (if) que verifica se o nome da criatura que estamos atacando está inserida em "Creatures". Caso não esteja, ela assumirá o comportamento de "combat", ou seja, será uma arma com a fórmula e dano físico padrão do servidor; caso o nome esteja na minha lista especial, a arma assumirá "Combar2" e terá uma fórmula de dano x2, será uma arma poderosa contra essa criatura listada.
Uma vez feito o script, não se esqueça de registrá-lo na arma de sua preferência no weapons.xml.
Ex:
<melee id="2397" event="script" value="nome.lua">
Algumas ideias de como você pode utilizar a base do código:
- Quests e bosses; podemos fazer um boss que só seja derrotado com uma arma específica, por exemplo.
- Podemos brincar com mais recursos, como getPlayerVocation ou getPlayerLevel e com mais condicionais fazer armas que só liberem seu poder oculto nas mãos de alguma vocação, em um certo level, contra um tipo de criatura, etc.
- Eu utilizei no meu servidor que é baseado em Dungeons & Dragons para fazer com que mortos vivos tomem dano integral de ataques com club mas tomem metade do dano contra ataques de sword/axe (neste universo mortos-vivos são melhor esmagados do que cortados ou perfurados).
Enfim, um exemplo prático: crio uma quest com a recompensa de uma espada conhecida por "exterminar dragões". Registro no weapons.xml esta arma com um script.lua do meu gosto, como:
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat, COMBAT_PARAM_BLOCKSHIELD, 1) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatFormula(combat, COMBAT_FORMULA_SKILL, 1.0, 0, 1.0, 0) local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_LIFEDRAIN) setCombatParam(combat2, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_RED) setCombatFormula(combat2, COMBAT_FORMULA_SKILL, 0, -60, 0, -90) local creatures = {"Dragon", "Dragon Lord", "Frost Dragon"} function onUseWeapon(cid, var) local target = getCreatureTarget(cid) local nome = getCreatureName(target) if (not isInArray (creatures, nome)) then doCombat(cid, combat, var) else doCombat(cid, combat, var) doCombat(cid, combat2, var) end end Neste caso coloquei para, no caso de ser um dos dragões listados, ocorrer tanto o combat como o combat2, ou seja, a espada não só atacar como também drenar uma certa quantidade de vida da criatura (60-90). E no resto do tempo, ela será uma espada normal.
É isso ai, espero ter contribuído.
Até a próxima.
-
Tadelho recebeu reputação de SoulSarti em Aumentar o dano de acordo com um storageHá o Critical System do Night Wolf que faz exatamente isso, dá para adaptar.
Bastaria mudar o multiplicador para 10 e adicionar mais uma storage para fazer essa verificação que você quer. Se o dano aumentado ocorrer sempre, tire a verificação de probabilidade e só verifique o valor da storage, como você quer. "Se o valor da storage for tanto, faça o dano x tanto."
Depois seria necessário registrar o script no creaturescripts.xml e no xml dos monstros.
creaturescript:
monstro.xml:
E se você não tiver essas funções... aí sim, uma outra source seria interessante, não imagino como fazer dano crítico sem isso.
-
Tadelho recebeu reputação de OmegaZero em (Resolvido)DOUBLE HIT NA ARMA@OmegaZero
Cara, eu não sei qual a versão de servidor que você está utilizando. Eu vou te fazer aqui um script para TFS 0.4.0, é bem simples.
Crie um arquivo .lua na pasta ...weapons/scripts (escolha o nome do arquivo, ex: "script.lua")
Dentro do arquivo insira o seguinte código:
Explicando o script: toda vez que você atacar com a arma, ele irá sortear um número de 1 a 100. Se este número for maior que a chance que você determinou, o ataque ocorrerá normalmente. Se for menor, a arma fará um ataque adicional 500 milissegundos depois do primeiro (ataque duplo).
Agora vá em weapons.xml e registre este script na arma que você quer que tenha esse comportamento. Ex:
Obs: melee id = o ID number da arma que você quer.
Para TFS 0.4.0 é isso. Se você estiver usando outra versão, não saberei ajudar.
-
Tadelho recebeu reputação de guinaatz em (Resolvido)DOUBLE HIT NA ARMA@OmegaZero
Cara, eu não sei qual a versão de servidor que você está utilizando. Eu vou te fazer aqui um script para TFS 0.4.0, é bem simples.
Crie um arquivo .lua na pasta ...weapons/scripts (escolha o nome do arquivo, ex: "script.lua")
Dentro do arquivo insira o seguinte código:
Explicando o script: toda vez que você atacar com a arma, ele irá sortear um número de 1 a 100. Se este número for maior que a chance que você determinou, o ataque ocorrerá normalmente. Se for menor, a arma fará um ataque adicional 500 milissegundos depois do primeiro (ataque duplo).
Agora vá em weapons.xml e registre este script na arma que você quer que tenha esse comportamento. Ex:
Obs: melee id = o ID number da arma que você quer.
Para TFS 0.4.0 é isso. Se você estiver usando outra versão, não saberei ajudar.
-
Tadelho deu reputação a Kydrai em (Resolvido)2 BlockHit por turno na Source ( TFS 0.4.0)--blockCount é a mesma coisa que blockCount = blockCount - 1, então toda vez que executar isso (que é quando sofre o ataque) ele vai subtrair 1 do blockCount.
-
Tadelho deu reputação a Kydrai em (Resolvido)2 BlockHit por turno na Source ( TFS 0.4.0)blockCount e blockTicks no creature.cpp.
A cada 1 segundo no blockTicks adiciona +1 no blockCount (sendo que o máximo é 2).
E a cada a cada ataque sofrido adiciona -1 no blockCount.
Quando receber um ataque, se o blockCount não for maior que 0 então não utiliza a defesa.