IA
pedido

Arma que só ataca Player

Por iagonp, 04 de dez. de 2013 em Scripts

armas players
resolvido
18
2.6k
iagonpI
04 de dezembro de 2013 às 10:54

Galera alguém sabe como colocar uma condição na arma para quando o player atacar um monstro hitar no máximo 800 e se atacar player o hite é calculado pelo Level e ML, dai o hite iria ser mais que 9k.

 

Ex: Player com a arma editada ataca outro player a arma calula o Level e ML como se fosse uma skill para tirar o dano aproximado de 9000, mais se o player ataca um monstro o dano será apenas 800 ou calcular com o Level e ML mais o hite seria próximo a 800.

 

Tem como fazer uma arma assim? Seria tipo uma arma PVP, que serviria mais para x1 ou WAR do que UPA.

 

Alguém teria ideia de como fazer se for possível? Agradeço!

KilluaK
04 de dezembro de 2013 às 12:16

Gostei da sua ideia, mas me diz: poderia fazer ela dar esse hit controlado em monstros e o hit normal em players?


Digo isso pra nao ter que fazer uma formula que subtraia a defesa do player atacado.

iagonpI
04 de dezembro de 2013 às 12:38

É porque Wand, Livro e Rod não conta ML na hora de atacar.. Por isso queria o calculo do ML e Skill e Level.

 

Ex: Wand, Rod e Livro teria a formula Level * ML. Axe, Sword, Club e Crossbow teria a formula Level * Skill.

 

Se deixar padrão as wand não vão contar o ML que seria o certo já que é mage.

Editado Dezembro 4 por iagionp

KilluaK
04 de dezembro de 2013 às 12:47

Entendi, mas testa ai o que eu fiz pra armas corpo-a-corpo so pra gente ter uma base:


@EDIT - tava com um erro mas arrumei, testa ai.


local id_da_arma = 4322 -- id da SWORD
local dano = 100,1000 -- dano minimo e maximo

function onCombat(cid, target)
    local formula = getPlayerLevel(cid) * getPlayerSkillLevel(cid,2)
    
 
    if getPlayerSlotItem(cid,5).itemid == id_da_arma or getPlayerSlotItem(cid,6).itemid == id_da_arma then 
        if isMonster(target) then     
            if combat == COMBAT_PHYSICALDAMAGE then
                doCreatureAddHealth(target, -math.random(dano))
                return false
            end
        end
   
    elseif isPlayer(cid) and combat == COMBAT_PHYSICALDAMAGE then
        doCreatureAddHealth(target, -formula)
        return false
    end
    return true
end

Editado Dezembro 4 por amoeba13

iagonpI
04 de dezembro de 2013 às 12:53

Não funcionou.. Bateu 2100 no monstro! =/

KilluaK
04 de dezembro de 2013 às 12:57

Não funcionou.. Bateu 2100 no monstro! =/

 

Testou esse ultimo que eu editei?

 

 

@EDIT - Esqueci de avisar que eh em creaturescripts que vc tem que por isso.

 

TAG

 

<event type="combat" name="AttackMonster" script="SeuSCRIPT.lua"/>
E tem que registar no login.lua
registerCreatureEvent(cid, "AttackMonster")

Editado Dezembro 4 por amoeba13

iagonpI
04 de dezembro de 2013 às 13:18

Testei agora novamente, mais continuo do mesmo jeito. Coloquei no creaturescript e não deu nenhum erro, também coloquei no login o registro.

 

No monstro bate até 2k e pouco. =/

KilluaK
04 de dezembro de 2013 às 13:59

:/ to testando mil coisas aqui, se der certo eu posto

ZarussZ
04 de dezembro de 2013 às 14:16

troca essa tag do login.lua

registerCreatureEvent(cid, "AttackMonster")

 

por essa(nao sei se vai funcionar)

registerCreatureEvent(target, "AttackMonster")

KilluaK
04 de dezembro de 2013 às 14:33

A funcao q eu usei ta errada, teria q ser a onStatsChange. Dai do jeito que o Zaruss falou eh registerCreatureEvent(attacker, "AttackMonster")

To tentando aqui ainda...

04 de dezembro de 2013 às 14:36

amoeba usa onTarget que vai funcionar ^^

iagonpI
04 de dezembro de 2013 às 14:45

Estou no aguardo para! ^^

OmegaO
04 de dezembro de 2013 às 20:06

amoeba usa onTarget que vai funcionar ^^

 

A funcao q eu usei ta errada, teria q ser a onStatsChange. Dai do jeito que o Zaruss falou eh registerCreatureEvent(attacker, "AttackMonster")

To tentando aqui ainda...

 

Jovens padawans, pelo que eu entendi, fica muito mais fácil fazer usando weapons:

 

 

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYHIT)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY)

function getCombatFormulas(cid, lv, maglv)
	local formula_min = -((lv*2 + maglv*10) * 0.2)
	local formula_max = -((lv*2 + maglv*10) * 0.5)
	return formula_min, formula_max
end

setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "getCombatFormulas")

function onUseWeapon(cid)
	local target = getCreatureTarget(cid)
	if isMonster(target) then
		doSendDistanceShoot(getThingPos(cid), getThingPos(target), CONST_ANI_ENERGY)
		doTargetCombatHealth(cid, target, COMBAT_ENERGYDAMAGE, -200, -800, CONST_ME_ENERGYHIT)
		return true
	end
	local var = numberToVariant(getCreatureTarget(cid))
	return doCombat(cid, combat, var)
end

 

 

E registra no weapons.xml:

<wand id="id da wand" level="level para usar" mana="mana que gasta com cada hit" event="script" value="wandtry.lua">
	<vocation id="1"/>
	<vocation id="5"/>
	<vocation id="2"/>
	<vocation id="3"/>
	<vocation id="4"/>
	<vocation id="10" showInDescription="0"/>
</wand>

Aí é só mudar o script pra usar a fórmula que você quiser e ajeitar as tags pra suas necessidades. Então é só felicidade.

No caso, isso é uma rod ou wand que dá dano de energy, adapte pro que você preferir.

Ah, salva esse código em weapons/scripts como wandtry.lua

iagonpI
04 de dezembro de 2013 às 20:53

 

amoeba usa onTarget que vai funcionar ^^

 

A funcao q eu usei ta errada, teria q ser a onStatsChange. Dai do jeito que o Zaruss falou eh registerCreatureEvent(attacker, "AttackMonster")

To tentando aqui ainda...

 

Jovens padawans, pelo que eu entendi, fica muito mais fácil fazer usando weapons:

 

 

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYHIT)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY)

function getCombatFormulas(cid, lv, maglv)
	local formula_min = -((lv*2 + maglv*10) * 0.2)
	local formula_max = -((lv*2 + maglv*10) * 0.5)
	return formula_min, formula_max
end

setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "getCombatFormulas")

function onUseWeapon(cid)
	local target = getCreatureTarget(cid)
	if isMonster(target) then
		doSendDistanceShoot(getThingPos(cid), getThingPos(target), CONST_ANI_ENERGY)
		doTargetCombatHealth(cid, target, COMBAT_ENERGYDAMAGE, -200, -800, CONST_ME_ENERGYHIT)
		return true
	end
	local var = numberToVariant(getCreatureTarget(cid))
	return doCombat(cid, combat, var)
end

 

 

E registra no weapons.xml:

<wand id="id da wand" level="level para usar" mana="mana que gasta com cada hit" event="script" value="wandtry.lua">
	<vocation id="1"/>
	<vocation id="5"/>
	<vocation id="2"/>
	<vocation id="3"/>
	<vocation id="4"/>
	<vocation id="10" showInDescription="0"/>
</wand>

Aí é só mudar o script pra usar a fórmula que você quiser e ajeitar as tags pra suas necessidades. Então é só felicidade.

No caso, isso é uma rod ou wand que dá dano de energy, adapte pro que você preferir.

Ah, salva esse código em weapons/scripts como wandtry.lua

 

 

Perfeito cara, exatamente o que eu queria...

Contando Level * ML para mages e Level * Skill para físicos.. Você é o cara, rep+ para você e outro para o amoeba13 por tentar fazer. Valeu pela atenção e muito obrigado!

OmegaO
04 de dezembro de 2013 às 20:56

Tópico movido para a seção de dúvidas e pedidos resolvidos.