Ir para conteúdo
  • Cadastre-se

(Resolvido)[ Pedido ] tem que lança magia


Ir para solução Resolvido por marcot,

Posts Recomendados

Isto mesmo pessoal, estou precisando de um script onde tal item, exemplo eu crio um item novo que vai servir como uma especie de "runa" que ao clicar em use neste item ele solta a magia que eu colocar nele para que ele solte, exemplo "Livro da Vida" ai ele solta a magia "exura".

alguém poderia me ajudar?

Link para o post
Compartilhar em outros sites

Você pode fazer assim no caso da exura, cria o arquivo item_skill.lua em data/actions/scripts:

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HEALING)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)
setCombatParam(combat, COMBAT_PARAM_TARGETCASTERORTOPMOST, 1)
setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, 0)
setCombatParam(combat, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE)

function onGetFormulaValues(cid, level, maglevel)
	min = (level * 2 + maglevel * 3) * 0.5 - 30
	max = (level * 2 + maglevel * 3) * 0.6
	
	if min < 25 then
		min = 25
	end

	return min, max
end

setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

function onUse(cid, item, frompos, item2, topos)
	return doCombat(cid, combat, numberToVariant(cid))
end

E adicionar em actions.xml a tag:

<action itemid="2195" script="item_skill.lua" />

Isso no OTServ SVN Version 0.6.0.

Basicamente, qual a diferença? Um action você teria que ter a função "onUse". Dentro dela você chama o "doCombat" e como não temos o parâmetro "var" vamos usar o "numberToVariant(cid)".

Link para o post
Compartilhar em outros sites
12 minutos atrás, marcot disse:

Você pode fazer assim no caso da exura, cria o arquivo item_skill.lua em data/actions/scripts:


local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HEALING)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)
setCombatParam(combat, COMBAT_PARAM_TARGETCASTERORTOPMOST, 1)
setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, 0)
setCombatParam(combat, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE)

function onGetFormulaValues(cid, level, maglevel)
	min = (level * 2 + maglevel * 3) * 0.5 - 30
	max = (level * 2 + maglevel * 3) * 0.6
	
	if min < 25 then
		min = 25
	end

	return min, max
end

setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

function onUse(cid, item, frompos, item2, topos)
	return doCombat(cid, combat, numberToVariant(cid))
end

E adicionar em actions.xml a tag:


<action itemid="2195" script="item_skill.lua" />

Isso no OTServ SVN Version 0.6.0.

Basicamente, qual a diferença? Um action você teria que ter a função "onUse". Dentro dela você chama o "doCombat" e como não temos o parâmetro "var" vamos usar o "numberToVariant(cid)".

onde mudo a magia que ira soltar?, e teria como fazer para quando usar ele perder mana, pois deu tudo certo mas nao usa mana :/

 

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

Você vai fazer o seguinte: copia tudo que está na magia e cola no action, depois procura essa parte:
 

function onCastSpell(cid, var)
	return doCombat(cid, combat, var)
end

e substitua por:

function onUse(cid, item, frompos, item2, topos)
	return doCombat(cid, combat, numberToVariant(cid))
end

 

Link para o post
Compartilhar em outros sites

 

22 minutos atrás, marcot disse:

Você vai fazer o seguinte: copia tudo que está na magia e cola no action, depois procura essa parte:
 


function onCastSpell(cid, var)
	return doCombat(cid, combat, var)
end

e substitua por:


function onUse(cid, item, frompos, item2, topos)
	return doCombat(cid, combat, numberToVariant(cid))
end

 

fiz o que disse só que ainda nao esta gastando mana :/ 

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

Vou tentar explicar dando um exemplo.

Quero fazer um item que solte "Exevo Mas San", o script equivalente no meu servidor é o holy light.lua. A princípio temos:

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, 49)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -0.5, -30, -1.1, 0)

local arr = {
{0, 0, 1, 1, 1, 0, 0},
{0, 1, 1, 1, 1, 1, 0},
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 3, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
{0, 1, 1, 1, 1, 1, 0},
{0, 0, 1, 1, 1, 0, 0}
}


local area = createCombatArea(arr)
setCombatArea(combat, area)

function onCastSpell(cid, var)
	return doCombat(cid, combat, var)
end

Quando você usa uma skill o que você chamou na verdade é a parte do script:

function onCastSpell(cid, var)
	return doCombat(cid, combat, var)
end

E a parte responsável por soltar uma magia é o "doCombat(cid, combat, var)". Botando os parâmetros "cid" e "var" de lado, quem é "combat"? A parte a seguir não é necessária para compreender totalmente como fazer para o item usar uma skill mas vamos lá:

 

Vamos voltar ao começo do script para entender quem é combat:

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, 49)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -0.5, -30, -1.1, 0)

local arr = {
{0, 0, 1, 1, 1, 0, 0},
{0, 1, 1, 1, 1, 1, 0},
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 3, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
{0, 1, 1, 1, 1, 1, 0},
{0, 0, 1, 1, 1, 0, 0}
}


local area = createCombatArea(arr)
setCombatArea(combat, area)

Na primeira linha criamos a variável "combat" e usamos uma espécie de construtor dessa variável. Depois disso definimos cada parte do script.

Na segunda linha definimos o "COMBAT_PARAM_TYPE", que é o tipo de dano.

Na terceira linha, definimos "COMBAT_PARAM_EFFECT", que é o efeito (49).

Na quarta linha, definimos "COMBAT_FORMULA_LEVELMAGIC" que vai ser a quantidade de dano.

Depois disso definimos a área, criamos a variável arr que é uma matriz definindo a área da skill,  facilitando a vida de pessoas que vão fazer skills.  E depois simplesmente "linkamos" essa matriz ao combat.

 

Enfim, quando usamos uma magia temos a função onCastSpell e quando usamos um action temos a função onUse, logo, não podemos simplesmente dar ctrl+c e ctrl+v para fazê-lo. Então vamos fazer o que está sendo feito dentro do onCastSpell dentro do onUse. O que temos dentro do onCastSpell que queremos no onUse?

function onCastSpell(cid, var)
	return doCombat(cid, combat, var)
end

E o que temos no action?

function onUse(cid, item, frompos, item2, topos)
	<codigo>
end

Note que no doCombat(cid, combat, var)  temos uma variável que não temos no onUse, então vamos colocar numberToVariant(cid) no lugar, ficando assim:

function onUse(cid, item, frompos, item2, topos)
	return doCombat(cid, combat, numberToVariant(cid))
end

No final das contas, o script do exevo mas san por item ficaria assim:

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, 49)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -0.5, -30, -1.1, 0)

local arr = {
{0, 0, 1, 1, 1, 0, 0},
{0, 1, 1, 1, 1, 1, 0},
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 3, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
{0, 1, 1, 1, 1, 1, 0},
{0, 0, 1, 1, 1, 0, 0}
}


local area = createCombatArea(arr)
setCombatArea(combat, area)

function onUse(cid, item, frompos, item2, topos)
	return doCombat(cid, combat, numberToVariant(cid))
end

 

[EDIT]:

31 minutos atrás, apollo333 disse:

 

fiz o que disse só que ainda nao esta gastando mana :/ 

 

Tinha me esquecido desse detalhe. Já edito e mando o exemplo acima gastando mana.

[EDIT2]:

local config = {
	requiredLevel = 100,
	usingMana = 200
}

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, 49)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -0.5, -30, -1.1, 0)

local arr = {
{0, 0, 1, 1, 1, 0, 0},
{0, 1, 1, 1, 1, 1, 0},
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 3, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
{0, 1, 1, 1, 1, 1, 0},
{0, 0, 1, 1, 1, 0, 0}
}


local area = createCombatArea(arr)
setCombatArea(combat, area)
function onUse(cid, item, frompos, item2, topos)
	if getPlayerLevel(cid) > config.requiredLevel then
		if getPlayerMana(cid) > config.usingMana then
			doPlayerAddMana(cid, -config.usingMana)
			return doCombat(cid, combat, numberToVariant(cid))
		else
			doPlayerSendCancel(cid, "Not enough mana.")
		end
	else
		doPlayerSendCancel(cid, "Not enough level.")
	end
	return TRUE
end

 

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

Vou tentar explicar dando um exemplo.

Quero fazer um item que solte "Exevo Mas San", o script equivalente no meu servidor é o holy light.lua. A princípio temos:


local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, 49)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -0.5, -30, -1.1, 0)

local arr = {
{0, 0, 1, 1, 1, 0, 0},
{0, 1, 1, 1, 1, 1, 0},
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 3, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
{0, 1, 1, 1, 1, 1, 0},
{0, 0, 1, 1, 1, 0, 0}
}


local area = createCombatArea(arr)
setCombatArea(combat, area)

function onCastSpell(cid, var)
	return doCombat(cid, combat, var)
end

Quando você usa uma skill o que você chamou na verdade é a parte do script:


function onCastSpell(cid, var)
	return doCombat(cid, combat, var)
end

E a parte responsável por soltar uma magia é o "doCombat(cid, combat, var)". Botando os parâmetros "cid" e "var" de lado, quem é "combat"? A parte a seguir não é necessária para compreender totalmente como fazer para o item usar uma skill mas vamos lá:

 

Vamos voltar ao começo do script para entender quem é combat:


local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, 49)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -0.5, -30, -1.1, 0)

local arr = {
{0, 0, 1, 1, 1, 0, 0},
{0, 1, 1, 1, 1, 1, 0},
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 3, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
{0, 1, 1, 1, 1, 1, 0},
{0, 0, 1, 1, 1, 0, 0}
}


local area = createCombatArea(arr)
setCombatArea(combat, area)

Na primeira linha criamos a variável "combat" e usamos uma espécie de construtor dessa variável. Depois disso definimos cada parte do script.

Na segunda linha definimos o "COMBAT_PARAM_TYPE", que é o tipo de dano.

Na terceira linha, definimos "COMBAT_PARAM_EFFECT", que é o efeito (49).

Na quarta linha, definimos "COMBAT_FORMULA_LEVELMAGIC" que vai ser a quantidade de dano.

Depois disso definimos a área, criamos a variável arr que é uma matriz definindo a área da skill,  facilitando a vida de pessoas que vão fazer skills.  E depois simplesmente "linkamos" essa matriz ao combat.

 

Enfim, quando usamos uma magia temos a função onCastSpell e quando usamos um action temos a função onUse, logo, não podemos simplesmente dar ctrl+c e ctrl+v para fazê-lo. Então vamos fazer o que está sendo feito dentro do onCastSpell dentro do onUse. O que temos dentro do onCastSpell que queremos no onUse?


function onCastSpell(cid, var)
	return doCombat(cid, combat, var)
end

E o que temos no action?


function onUse(cid, item, frompos, item2, topos)
	<codigo>
end

Note que no doCombat(cid, combat, var)  temos uma variável que não temos no onUse, então vamos colocar numberToVariant(cid) no lugar, ficando assim:


function onUse(cid, item, frompos, item2, topos)
	return doCombat(cid, combat, numberToVariant(cid))
end

No final das contas, o script do exevo mas san por item ficaria assim:


local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, 49)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -0.5, -30, -1.1, 0)

local arr = {
{0, 0, 1, 1, 1, 0, 0},
{0, 1, 1, 1, 1, 1, 0},
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 3, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
{0, 1, 1, 1, 1, 1, 0},
{0, 0, 1, 1, 1, 0, 0}
}


local area = createCombatArea(arr)
setCombatArea(combat, area)

function onUse(cid, item, frompos, item2, topos)
	return doCombat(cid, combat, numberToVariant(cid))
end

 

[EDIT]:

Tinha me esquecido desse detalhe. Já edito e mando o exemplo acima gastando mana.

[EDIT2]:


local config = {
	requiredLevel = 100,
	usingMana = 200
}

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, 49)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -0.5, -30, -1.1, 0)

local arr = {
{0, 0, 1, 1, 1, 0, 0},
{0, 1, 1, 1, 1, 1, 0},
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 3, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
{0, 1, 1, 1, 1, 1, 0},
{0, 0, 1, 1, 1, 0, 0}
}


local area = createCombatArea(arr)
setCombatArea(combat, area)
function onUse(cid, item, frompos, item2, topos)
	if getPlayerLevel(cid) > config.requiredLevel then
		if getPlayerMana(cid) > config.usingMana then
			doPlayerAddMana(cid, -config.usingMana)
			return doCombat(cid, combat, numberToVariant(cid))
		else
			doPlayerSendCancel(cid, "Not enough mana.")
		end
	else
		doPlayerSendCancel(cid, "Not enough level.")
	end
	return TRUE
end

 

 

meio complexo mais vou estudar aqui, mas para simplificar para criar cada item com tal magia eu devo apenas adcionar no x-item.lua a chamada do script deste dal spell?

Link para o post
Compartilhar em outros sites

Um action não vai funcionar se tiver o function onCastSpell (cid, var). Então você troca para function onUse(cid, item, frompos, item2, topos) e para o action chamar a skill você deve ter o doCombat(cid, combat, var), mas você não tem var numa action, então você troca para doCombat(cid, combat, numberToVariant(cid))

 

Se você preferir faz assim:

Pega o spell que você quer que seja o item e copie numa nova action.

Adicione ao começo 

local config = {
	requiredLevel = 100,
	usingMana = 200
}

E substitua o

function onCastSpell(cid, var)
	return doCombat(cid, combat, var)
end

Por

function onUse(cid, item, frompos, item2, topos)
	if getPlayerLevel(cid) > config.requiredLevel then
		if getPlayerMana(cid) > config.usingMana then
			doPlayerAddMana(cid, -config.usingMana)
			return doCombat(cid, combat, numberToVariant(cid))
		else
			doPlayerSendCancel(cid, "Not enough mana.")
		end
	else
		doPlayerSendCancel(cid, "Not enough level.")
	end
	return TRUE
end

 

Link para o post
Compartilhar em outros sites
21 horas atrás, marcot disse:

Um action não vai funcionar se tiver o function onCastSpell (cid, var). Então você troca para function onUse(cid, item, frompos, item2, topos) e para o action chamar a skill você deve ter o doCombat(cid, combat, var), mas você não tem var numa action, então você troca para doCombat(cid, combat, numberToVariant(cid))

 

Se você preferir faz assim:

Pega o spell que você quer que seja o item e copie numa nova action.

Adicione ao começo 


local config = {
	requiredLevel = 100,
	usingMana = 200
}

E substitua o


function onCastSpell(cid, var)
	return doCombat(cid, combat, var)
end

Por


function onUse(cid, item, frompos, item2, topos)
	if getPlayerLevel(cid) > config.requiredLevel then
		if getPlayerMana(cid) > config.usingMana then
			doPlayerAddMana(cid, -config.usingMana)
			return doCombat(cid, combat, numberToVariant(cid))
		else
			doPlayerSendCancel(cid, "Not enough mana.")
		end
	else
		doPlayerSendCancel(cid, "Not enough level.")
	end
	return TRUE
end

 

 neste caso aqui onde criei a spell no spellcreator 

 

Spoiler

-- SpellCreator generated.

-- =============== COMBAT VARS ===============
-- Areas/Combat for 0ms
local combat0_Brush = createCombatObject()
setCombatParam(combat0_Brush, COMBAT_PARAM_EFFECT, CONST_ME_DRAWBLOOD)
setCombatParam(combat0_Brush, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_POISON)
setCombatParam(combat0_Brush, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatArea(combat0_Brush,createCombatArea({{2}}))
function getDmg_Brush(cid, level, maglevel)
    return (10)*-1,(20)*-1 
end
setCombatCallback(combat0_Brush, CALLBACK_PARAM_LEVELMAGICVALUE, "getDmg_Brush")
local dfcombat0_Brush = {CONST_ANI_THROWINGSTAR}local combat0_Brush = createCombatObject()
setCombatParam(combat0_Brush, COMBAT_PARAM_EFFECT, CONST_ME_HITBYFIRE)
setCombatParam(combat0_Brush, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE)
setCombatParam(combat0_Brush, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatArea(combat0_Brush,createCombatArea({{2}}))
function getDmg_Brush(cid, level, maglevel)
    return (10)*-1,(20)*-1 
end
setCombatCallback(combat0_Brush, CALLBACK_PARAM_LEVELMAGICVALUE, "getDmg_Brush")
local dfcombat0_Brush = {CONST_ANI_ENERGY}local combat0_Brush_2 = createCombatObject()
setCombatParam(combat0_Brush_2, COMBAT_PARAM_EFFECT, CONST_ME_TELEPORT)
setCombatParam(combat0_Brush_2, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE)
setCombatParam(combat0_Brush_2, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatArea(combat0_Brush_2,createCombatArea({{2}}))
function getDmg_Brush_2(cid, level, maglevel)
    return (100)*-1,(100)*-1 
end
setCombatCallback(combat0_Brush_2, CALLBACK_PARAM_LEVELMAGICVALUE, "getDmg_Brush_2")
local dfcombat0_Brush_2 = {CONST_ANI_SPEAR}local combat0_Brush = createCombatObject()
setCombatParam(combat0_Brush, COMBAT_PARAM_EFFECT, CONST_ME_FIREWORK_YELLOW)
setCombatParam(combat0_Brush, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE)
setCombatParam(combat0_Brush, COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE)
setCombatArea(combat0_Brush,createCombatArea({{2}}))
function getDmg_Brush(cid, level, maglevel)
    return (10)*-1,(20)*-1 
end
setCombatCallback(combat0_Brush, CALLBACK_PARAM_LEVELMAGICVALUE, "getDmg_Brush")
local dfcombat0_Brush = {CONST_ANI_ARROW}local combat0_Brush = createCombatObject()
setCombatParam(combat0_Brush, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_GREEN)
setCombatParam(combat0_Brush, COMBAT_PARAM_TYPE, COMBAT_HEALING)
setCombatArea(combat0_Brush,createCombatArea({{3}}))
function getDmg_Brush(cid, level, maglevel)
    return (10),(10) 
end
setCombatCallback(combat0_Brush, CALLBACK_PARAM_LEVELMAGICVALUE, "getDmg_Brush")

-- Areas/Combat for 100ms
local combat1_Brush = createCombatObject()
setCombatParam(combat1_Brush, COMBAT_PARAM_EFFECT, CONST_ME_FIREWORK_YELLOW)
setCombatParam(combat1_Brush, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE)
setCombatParam(combat1_Brush, COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE)
setCombatArea(combat1_Brush,createCombatArea({{2}}))
function getDmg_Brush(cid, level, maglevel)
    return (10)*-1,(20)*-1 
end
setCombatCallback(combat1_Brush, CALLBACK_PARAM_LEVELMAGICVALUE, "getDmg_Brush")
local dfcombat1_Brush = {CONST_ANI_ARROW}local combat1_Brush = createCombatObject()
setCombatParam(combat1_Brush, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_GREEN)
setCombatParam(combat1_Brush, COMBAT_PARAM_TYPE, COMBAT_HEALING)
setCombatArea(combat1_Brush,createCombatArea({{3}}))
function getDmg_Brush(cid, level, maglevel)
    return (10),(10) 
end
setCombatCallback(combat1_Brush, CALLBACK_PARAM_LEVELMAGICVALUE, "getDmg_Brush")

-- =============== CORE FUNCTIONS ===============
local function RunPart(c,cid,var,dirList,dirEmitPos) -- Part
    if (isCreature(cid)) then
        doCombat(cid, c, var)
        if (dirList ~= nil) then -- Emit distance effects
            local i = 2;
            while (i < #dirList) do
                doSendDistanceShoot(dirEmitPos,{x=dirEmitPos.x-dirList,y=dirEmitPos.y-dirList[i+1],z=dirEmitPos.z},dirList[1])
                i = i + 2
            end        
        end
    end
end

function onCastSpell(cid, var)
    local startPos = getCreaturePosition(cid)
    RunPart(combat0_Brush,cid,var,dfcombat0_Brush,startPos)
    RunPart(combat0_Brush,cid,var,dfcombat0_Brush,startPos)
    RunPart(combat0_Brush_2,cid,var,dfcombat0_Brush_2,startPos)
    RunPart(combat0_Brush,cid,var,dfcombat0_Brush,startPos)
    RunPart(combat0_Brush,cid,var)
    addEvent(RunPart,100,combat1_Brush,cid,var,dfcombat1_Brush,startPos)
    addEvent(RunPart,100,combat1_Brush,cid,var)
    return true
end

 

eu faria a mesma coisa no final dela para que possa ser usada em um item?

Link para o post
Compartilhar em outros sites

gostei, eu estou buscando algo assim tbm, mas me deixa entender isso @marcot

 

um exemplo eu crio um "item_skill.lua" ou seja no meu caso item-magico.lua com a magia exana pox

depois vou em actionn.xml e crio a tag <action itemid="2512" script="item_skill.lua" />  com o ID do item que vai lançar a Spell

 

ai no inicio do item-magico.lua

eu coloco 

 

Spoiler

local config = {
	requiredLevel = 100,
	usingMana = 200
}

 para poder usar mana quando for usado!

--------------------------------------------------------------------------------------------------

depois no final substitui o ultimo texto que no meu caso é

Spoiler

function onCastSpell(cid, var)
    return doCombat(cid, combat, var)
end

 

por este texto que você postou!

Spoiler

function onUse(cid, item, frompos, item2, topos)
	if getPlayerLevel(cid) > config.requiredLevel then
		if getPlayerMana(cid) > config.usingMana then
			doPlayerAddMana(cid, -config.usingMana)
			return doCombat(cid, combat, numberToVariant(cid))
		else
			doPlayerSendCancel(cid, "Not enough mana.")
		end
	else
		doPlayerSendCancel(cid, "Not enough level.")
	end
	return TRUE
en

 

 meu action antes da mudança!

Spoiler

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)
setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false)
setCombatParam(combat, COMBAT_PARAM_DISPEL, CONDITION_POISON)

function onCastSpell(cid, var)
    return doCombat(cid, combat, var)
end
 

 

depois da mudança

Spoiler

local config = {
    requiredLevel = 100,
    usingMana = 200
}

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)
setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false)
setCombatParam(combat, COMBAT_PARAM_DISPEL, CONDITION_POISON)

function onUse(cid, item, frompos, item2, topos)
    if getPlayerLevel(cid) > config.requiredLevel then
        if getPlayerMana(cid) > config.usingMana then
            doPlayerAddMana(cid, -config.usingMana)
            return doCombat(cid, combat, numberToVariant(cid))
        else
            doPlayerSendCancel(cid, "Not enough mana.")
        end
    else
        doPlayerSendCancel(cid, "Not enough level.")
    end
    return TRUE
end

 

 

 fiz correto? :D

Link para o post
Compartilhar em outros sites

@marcot coloquei no meu servidor e deu tudo certo :D agora uma perguntinha pra esse script ficar perfeito, teria como colocar o item para upar magic level como a spell normal faz quando chamamos ela, e também colocar um tempo pra poder dar use no item, tipo 2 segundos ai depois pode usar dnv :D teria como fazer este favor? serei eternamente grato

Link para o post
Compartilhar em outros sites
43 minutos atrás, Samu DS disse:

@marcot coloquei no meu servidor e deu tudo certo :D agora uma perguntinha pra esse script ficar perfeito, teria como colocar o item para upar magic level como a spell normal faz quando chamamos ela, e também colocar um tempo pra poder dar use no item, tipo 2 segundos ai depois pode usar dnv :D teria como fazer este favor? serei eternamente grato

sim acabei de nota isso kkkk estava reparando que se clicar no item sem parar o jogo fica roubado, tem que colocar um delay e seria bom tbm upar magic lvl

 

Link para o post
Compartilhar em outros sites
  • Solução

@apollo333, @Samu DS

Desculpem nao ter respondido, estava maratonando uma série ontem.

Aqui a versão upando ML e com exausted:

local config = {
	requiredLevel = 100, -- Level necessario
	usingMana = 200, -- Mana que sera gasta
	storageID = 40001, -- Mude se ja estiver em uso
	timeExausted = 1, -- Tempo de exausted global
}

local errorMsg = {
	level = "Not enough level.",
	exausted = "You are exausted.",
	mana = "Not enough mana.",
}

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, 49)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -0.5, -30, -1.1, 0)

local arr = {
	{0, 0, 1, 1, 1, 0, 0},
	{0, 1, 1, 1, 1, 1, 0},
	{1, 1, 1, 1, 1, 1, 1},
	{1, 1, 1, 2, 1, 1, 1},
	{1, 1, 1, 1, 1, 1, 1},
	{0, 1, 1, 1, 1, 1, 0},
	{0, 0, 1, 1, 1, 0, 0}
}


local area = createCombatArea(arr)
setCombatArea(combat, area)

function onUse(cid, item, frompos, item2, topos)
	if getPlayerLevel(cid) > config.requiredLevel then
		if getPlayerStorageValue (cid, config.storageID) < os.time() then
			if getPlayerMana(cid) > config.usingMana then
				doPlayerAddMana(cid, -config.usingMana)
				doPlayerAddSpentMana(cid, config.usingMana, true)
				setPlayerStorageValue(cid, config.storageID, os.time() + config.timeExausted)
				return doCombat(cid, combat, numberToVariant(cid))
			else
				doPlayerSendCancel(cid, errorMsg.mana)
				doSendMagicEffect(getCreaturePosition(cid), 2)
			end
		else
			doPlayerSendCancel(cid, errorMsg.exausted)
			doSendMagicEffect(getCreaturePosition(cid), 2)
		end
	else
		doPlayerSendCancel(cid, errorMsg.level)
	end
	return TRUE
end

 

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

@marcot desculpa te incomodar tanto rsrsrs mas e que ainda me restou apenas uma duvida, eu criei esta spell 

Spoiler


local combat0_Brush = createCombatObject()
setCombatParam(combat0_Brush, COMBAT_PARAM_EFFECT, CONST_ME_HOLYDAMAGE)
setCombatParam(combat0_Brush, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatArea(combat0_Brush,createCombatArea({{1, 0, 1},
{1, 2, 1},
{1, 1, 1}}))
function getDmg_Brush(cid, level, maglevel)
    return (10)*-1,(20)*-1 
end
setCombatCallback(combat0_Brush, CALLBACK_PARAM_LEVELMAGICVALUE, "getDmg_Brush")


local function RunPart(c,cid,var,dirList,dirEmitPos)
    if (isCreature(cid)) then
        doCombat(cid, c, var)
        if (dirList ~= nil)
            local i = 2;
            while (i < #dirList) do
                doSendDistanceShoot(dirEmitPos,{x=dirEmitPos.x-dirList,y=dirEmitPos.y-dirList[i+1],z=dirEmitPos.z},dirList[1])
                i = i + 2
            end        
        end
    end
end

function onCastSpell(cid, var)
    local startPos = getCreaturePosition(cid)
    RunPart(combat0_Brush,cid,var)
    return true
end

C9UL9qYAQCCgEIc93lZBIg.gif

 porem quando adciono o script no inicio e no final ela nao funciona, mas quando coloco ela dentro do arquivo da pasta spell e chamdo ela pelo nome ela e lançada, saberia me dizer porque ela nao quer ser lançada com item?

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

Essa ultima script que você mandou está com vários erros.

Tem um erro de sintaxe de um if sem then, e a função RunPart está sendo chamada sem todos seus 5 parâmetros, onde 2 deles não foram definidos no código (dirList dirEmitPos)

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

@marcot pegando o caminho andando aqui hehehehe porque algumas spells do proprio ot não funcionão no item, um exemplo deles e o "exevo gran mas frigo"

 

e um exemplo de erro que da e este 

 

Spoiler

[11/01/2018 16:29:46] [Error - Action Interface] 
[11/01/2018 16:29:46] data/actions/scripts/spellx.lua
[11/01/2018 16:29:46] Description: 
[11/01/2018 16:29:46] (luaSetCombatArea) Area not found

 

outras spells o servidor antes de iniciar ou quando dou /reload all o servidor fecha sozinho :/

 

 

Link para o post
Compartilhar em outros sites
3 minutos atrás, Samu DS disse:

@marcot pegando o caminho andando aqui hehehehe porque algumas spells do proprio ot não funcionão no item, um exemplo deles e o "exevo gran mas frigo"

 

e um exemplo de erro que da e este 

 

  Mostrar conteúdo oculto

[11/01/2018 16:29:46] [Error - Action Interface] 
[11/01/2018 16:29:46] data/actions/scripts/spellx.lua
[11/01/2018 16:29:46] Description: 
[11/01/2018 16:29:46] (luaSetCombatArea) Area not found

 

outras spells o servidor antes de iniciar ou quando dou /reload all o servidor fecha sozinho :/

 

 

Me manda como está seu script do exevo gran mas frigo, creio que tem coisa faltando.

Link para o post
Compartilhar em outros sites

@marcot aqui esta

Spoiler

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ICETORNADO)
setAttackFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 6, 12)

local area = createCombatArea(AREA_CROSS5X5)
setCombatArea(combat, area)

function onCastSpell(cid, var)
    return doCombat(cid, combat, var)
end
 

 

Link para o post
Compartilhar em outros sites
  • 3 weeks later...

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