TO
dúvida

O Que É Esse Error?

Por tonynamoral, 11 de dez. de 2012 em Scripts

resolvido
script
17
1.7k
tonynamoralT
11 de dezembro de 2012 às 17:01

Eu peguei esse script de reflect damage aki do Aluccard , porém ele fica dando error . e a funçao de adicionar o reflect no ITEM não está funcionando ;

 

Script :

 

 

 

<?xml version="1.0" encoding="UTF-8"?>

<mod name="Reflect System" version="0.1" author="Aluccard" contact="" enabled="yes">

<description>

Script que funciona para refletir danos para as creatures que o atacar.

</description>

 

<event type="login" name="regReflectDamage" event="script"><![CDATA[

function onLogin(cid)

registerCreatureEvent(cid,"ReflectDamage")

return true

end

]]></event>

 

<event type="statschange" name="ReflectDamage" event="script"><![CDATA[

 

local slotPos = {CONST_SLOT_NECKLACE, CONST_SLOT_FEET, CONST_SLOT_HEAD}

 

function onStatsChange(cid, attacker, type, combat, value)

local reflectPercent = 0

local dmg = value

local playerPos = getCreaturePosition(cid)

local attackerPos = getCreaturePosition(attacker)

 

for i = 1, #slotPos do

if getPlayerSlotItem(cid, slotPos).uid > 1 then

if getItemReflectPercent(getPlayerSlotItem(cid, slotPos).uid) then

reflectPercent = reflectPercent + getItemReflectPercent(getPlayerSlotItem(cid, slotPos).uid)

end

end

end

 

if reflectPercent > 0 then

dmg = math.ceil(-value*((100-reflectPercent)/100))

if (dmg < 0) then

doCreatureAddHealth(cid, dmg)

doSendAnimatedText(playerPos, -dmg, COLOR_RED)

doSendMagicEffect(playerPos, 0)

else

doSendMagicEffect(playerPos, 3)

end

 

dmg = math.ceil(-value*(reflectPercent/100))

if (dmg < 0) then

doCreatureAddHealth(attacker, dmg)

doSendAnimatedText(attackerPos, -dmg, COLOR_RED)

doSendDistanceShoot(playerPos, attackerPos, CONST_ANI_SMALLHOLY)

end

else

return true

end

end]]></event>

</mod>

 

 

 

Funão de Adicionar item com Reflect

function getItemReflectPercent(itemid)
			return getItemAttribute(itemid, "reflectPercent")
end
function doPlayerAddReflectedItem(cid, itemid, percent)
local item = doPlayerAddItem(cid, itemid)
doItemSetAttribute(item, "description", "[Reflect: "..percent.."%]")
doItemSetAttribute(item, "reflectPercent", percent)
end

return true
end

 

Agora o error :

[11/12/2012 17:01:03] [Error - CreatureScript Interface]
[11/12/2012 17:01:03] buffer:onStatsChange
[11/12/2012 17:01:03] Description:
[11/12/2012 17:01:03] [string "loadBuffer"]:11: attempt to call global 'getItemReflectPercent' (a nil value)
[11/12/2012 17:01:03] stack traceback:
[11/12/2012 17:01:03]  [string "loadBuffer"]:11: in function <[string "loadBuffer"]:3>

RoksasR
11 de dezembro de 2012 às 17:05

Esse System está na sua pasta mods certo? Se for então o erro não é ele, porque o erro no Distro se trata de um CreatureScripts. Oque você colocou de novo no CreatureScripts? Seja oque for nos passe para resolvermos.

Yan OliveiraY
11 de dezembro de 2012 às 17:07

Não testei, so tirei um end mas n deu bug, testa ae:

 

function getItemReflectPercent(itemid)
                               return getItemAttribute(itemid, "reflectPercent")
end
function doPlayerAddReflectedItem(cid, itemid, percent)
local item = doPlayerAddItem(cid, itemid)
doItemSetAttribute(item, "description", "[Reflect: "..percent.."%]")
doItemSetAttribute(item, "reflectPercent", percent)
return true
end

tonynamoralT
11 de dezembro de 2012 às 17:29

Quando tiro o END , apareceu 1 porrada de BUGS

OneshotO
11 de dezembro de 2012 às 17:36

Coloque as duas funções do script no seu arquivo 050-function.lua em data/lib

tonynamoralT
11 de dezembro de 2012 às 17:47

@

Oneshot

 

Já está .

Editado Dezembro 11 por tonynamoral

OneshotO
11 de dezembro de 2012 às 17:55

Essa função está errada

 

function getItemReflectPercent(itemid)
return getItemAttribute(itemid, "reflectPercent")
end

 

Como ela está, ela retorna apenas atributos únicos de itens, e caso eles não existam, retorna nil.

 

Fiz algumas modificações nela e no script:

 


function getItemReflectPercent(item)
local reflectPercent = getItemAttribute(item.uid) or getItemInfo(item.itemid).reflectPercent
return reflectPercent or 0
end

 

<?xml version="1.0" encoding="UTF-8"?>
<mod name="Reflect System" version="0.1" author="Aluccard" contact="" enabled="yes">
<description>
Script que funciona para refletir danos para as creatures que o atacar.
</description>

<event type="login" name="regReflectDamage" event="script"><![CDATA[
function onLogin(cid)
registerCreatureEvent(cid,"ReflectDamage")
return true
end
]]></event>

<event type="statschange" name="ReflectDamage" event="script"><![CDATA[

local slotPos = {CONST_SLOT_NECKLACE, CONST_SLOT_FEET, CONST_SLOT_HEAD}

function onStatsChange(cid, attacker, type, combat, value)
local reflectPercent = 0
local dmg = value
local playerPos = getCreaturePosition(cid)
local attackerPos = getCreaturePosition(attacker)

for i = 1, #slotPos do
if getPlayerSlotItem(cid, slotPos[i]).uid > 1 then
if getItemReflectPercent(getPlayerSlotItem(cid, slotPos[i])) then
reflectPercent = reflectPercent + getItemReflectPercent(getPlayerSlotItem(cid, slotPos[i]))
end
end
end

if reflectPercent > 0 then
dmg = math.ceil(-value*((100-reflectPercent)/100))
if (dmg < 0) then
doCreatureAddHealth(cid, dmg)
doSendAnimatedText(playerPos, -dmg, COLOR_RED)
doSendMagicEffect(playerPos, 0)
else
doSendMagicEffect(playerPos, 3)
end

dmg = math.ceil(-value*(reflectPercent/100))
if (dmg < 0) then
doCreatureAddHealth(attacker, dmg)
doSendAnimatedText(attackerPos, -dmg, COLOR_RED)
doSendDistanceShoot(playerPos, attackerPos, CONST_ANI_SMALLHOLY)
end
else
return true
end
end]]></event>
</mod>

 

Não estou certo se irá funcionar.

 

Abraços.

Editado Dezembro 11 por Oneshot

tonynamoralT
11 de dezembro de 2012 às 18:08

@

Oneshot

 

O BUG PERCISTE.

Editado Dezembro 11 por tonynamoral

OneshotO
11 de dezembro de 2012 às 18:28

É só agora notei que seu erro tem nada a ver com o que eu fiz. No caso o servidor acusa que a função não existe.

 

Vou tentar criar um sistema parecido sem usar mods, pois eu odeio eles.

 

Abraços.

tonynamoralT
11 de dezembro de 2012 às 18:29

Okay , voce vai tentar criar agoora?

OneshotO
11 de dezembro de 2012 às 18:48

Não agora que estou um tanto ocupado, mas se você quiser, você pode criar itens que refletem coisas pelo items.xml sem precisar de scripts secundários.

 

Por exemplo, vou pegar a magic plate armor, de ID 2472.

 

	<item id="2472" article="a" name="magic plate armor">
	<attribute key="description" value="An enchanted gem glows on the plate armor." />
	<attribute key="weight" value="8500" />
	<attribute key="armor" value="17" />
	<attribute key="slotType" value="body" />
</item>

 

Supondo que eu quero que ela reflita 10% de todos os tipos de dano, faço isso:

 

    <item id="2472" article="a" name="magic plate armor">
       <attribute key="description" value="An enchanted gem glows on the plate armor." />
       <attribute key="weight" value="8500" />
       <attribute key="armor" value="17" />
       <attribute key="reflectpercentall" value="10"/>
       <attribute key="reflectchanceall" value="100"/>
       <attribute key="slotType" value="body" />
   </item>

 

Assim ela terá 100% de chance de refletir 10% de todos os tipos de dano.

 

Lembrando que só funciona se estiver registrado no movements.xml.

 

Abraços.

Editado Dezembro 11 por Oneshot

tonynamoralT
11 de dezembro de 2012 às 18:54

E como eu faço para outro item adicione isso ,? e ir acumulado e pah?

OneshotO
11 de dezembro de 2012 às 18:59

Não é possível, esses tipos de atributos só podem ser configurados no items.xml,não é possível criar um item que modifique eles. Só criando um atributo falso e um script que se baseie nele, como o Aluccard fez.

 

Mas se você usar vários itens com reflexão, a taxa acumula sim.

Editado Dezembro 11 por Oneshot

tonynamoralT
11 de dezembro de 2012 às 19:55

tipo ,

 

 

doItemSetAttribute(item2.uid, "reflectallpercent", 3)

OneshotO
11 de dezembro de 2012 às 21:40

Já disse, não é possível.