<?xml version="1.0" encoding="UTF-8"?>
<mod name="Shield" tfs="0.3.6pl1" author="Cybermaster" web="otland.net" enabled="yes">
<config name="shield_setup"><![CDATA[
energy = createConditionObject(CONDITION_ENERGY)
setConditionParam(energy, CONDITION_PARAM_DELAYED, 1)
addDamageCondition(energy, 5, 2000, -10)
poison = createConditionObject(CONDITION_POISON)
setConditionParam(poison, CONDITION_PARAM_DELAYED, 1)
addDamageCondition(poison, 5, 2000, -10)
fire = createConditionObject(CONDITION_FIRE)
setConditionParam(fire, CONDITION_PARAM_DELAYED, 1)
addDamageCondition(fire, 5, 2000, -10)
freezing = createConditionObject(CONDITION_FREEZING)
setConditionParam(freezing, CONDITION_PARAM_DELAYED, 1)
addDamageCondition(freezing, 5, 2000, -10)
dazzled = createConditionObject(CONDITION_DAZZLED)
setConditionParam(dazzled, CONDITION_PARAM_DELAYED, 1)
addDamageCondition(dazzled, 5, 2000, -10)
cursed = createConditionObject(CONDITION_CURSED)
setConditionParam(cursed, CONDITION_PARAM_DELAYED, 1)
addDamageCondition(cursed, 5, 2000, -10)
mirrorCounterAttack = 'condition'
e,d,k = { --combat type and distance shoot effect, and condition
[COMBAT_ENERGYDAMAGE] = {35,energy },
[COMBAT_EARTHDAMAGE] = {29,poison },
[COMBAT_POISONDAMAGE] = {14,poison },
[COMBAT_FIREDAMAGE] = {3, fire },
[COMBAT_ICEDAMAGE] = {28,freezing},
[COMBAT_HOLYDAMAGE] = {30,dazzled },
[COMBAT_DEATHDAMAGE] = {31,cursed }
},
1361, --storage to store druid's shield charges
1362 --storage to store knight's shield charges
--array of the shields charges (Magic Level, Charges)
kina_array = {
{2, 1}, {6, 2}, {10, 3}
}
mage_array = {
{20, 1}, {60, 2}, {100, 3}
}
function doKnightShield(p, effect)
local pos = { --do not modify
{x=p.x+1,y=p.y,z=p.z },
{x=p.x+1,y=p.y+1,z=p.z},
{x=p.x,y=p.y+1,z=p.z },
{x=p.x-1,y=p.y+1,z=p.z},
{x=p.x-1,y=p.y,z=p.z },
{x=p.x-1,y=p.y-1,z=p.z},
{x=p.x,y=p.y-1,z=p.z },
{x=p.x+1,y=p.y-1,z=p.z}
}
for i = 1, #pos do
doSendDistanceShoot(p, pos[i], effect)
end
end
function getShieldCharges(cid, array)
table.sort(array, function(a, b) return a[1] > b[1] end)
for _, t in ipairs(array) do
if getPlayerMagLevel(cid) >= t[1] then
return t[2]
end
end
return array[1][2]
end
]]></config>
<event type="login" name="shield_register" event="script"><![CDATA[
function onLogin(cid)
registerCreatureEvent(cid,'shield')
return true
end]]>
</event>
<event type="statschange" name="shield" event="script"><![CDATA[
domodlib('shield_setup')
function onStatsChange(cid, attacker, type, combat, value)
if isDruid(cid) and isCreature(attacker) and e[combat] and getCreatureStorage(cid, d) > 0 then
doSendMagicEffect(getThingPos(cid), CONST_ME_MAGIC_RED)
doCreatureSetStorage(cid, d, getCreatureStorage(cid, d)-1)
doSendDistanceShoot(getThingPos(cid), getThingPos(attacker), e[combat][1])
doPlayerSendCancel(cid, 'Your mirror shield has '.. (getCreatureStorage(cid,d) > 0 and getCreatureStorage(cid,d) or 'no') ..' charges left.')
if mirrorCounterAttack == 'condition' then
doTargetCombatCondition(cid, attacker, e[combat][2], CONST_ME_MAGIC_RED)
elseif mirrorCounterAttack == 'damage' then
doTargetCombatHealth(cid, attacker, combat, -value, -value, CONST_ME_MAGIC_RED)
elseif mirrorCounterAttack == 'both' then
doTargetCombatCondition(cid, attacker, e[combat][2], CONST_ME_MAGIC_RED)
doTargetCombatHealth(cid, attacker, combat, -value, -value, CONST_ME_MAGIC_RED)
end
return false
elseif isKnight(cid) and isCreature(attacker) and e[combat] and getCreatureStorage(cid, k) > 0 then
doKnightShield(getThingPos(cid), e[combat][1])
doSendMagicEffect(getThingPos(cid), CONST_ME_MAGIC_RED)
doCreatureSetStorage(cid, k, getCreatureStorage(cid, k)-1)
doPlayerSendCancel(cid, 'Your ultimate shield has '.. (getCreatureStorage(cid,k) > 0 and getCreatureStorage(cid,k) or 'no') ..' charges left.')
return false
end
return true
end]]>
</event>
<instant name="Ultimate Shield" words="utamo max" lvl="60" mana="100" soul="3" exhaustion="2000" event="script">
<text><![CDATA[
domodlib('shield_setup')
function onCastSpell(cid, var)
if getCreatureStorage(cid, k) > 0 then
doSendMagicEffect(getThingPos(cid), CONST_ME_POFF)
doPlayerSendCancel(cid,'Your ultimate shield still has '.. getCreatureStorage(cid, k) ..' charges.')
return false
end
doCreatureSetStorage(cid, k, getShieldCharges(cid, kina_array))
doSendMagicEffect(getThingPos(cid), CONST_ME_MAGIC_GREEN)
doPlayerSendCancel(cid,'You have just enabled your ultimate shield with '.. getCreatureStorage(cid, k) ..' charges.')
return true
end]]>
</text><vocation id="1;8"/>
</instant>
<instant name="Mirror Shield" words="utamo gran" lvl="60" mana="300" soul="3" exhaustion="2000" event="script"><text>
<![CDATA[
domodlib('shield_setup')
function onCastSpell(cid, var)
if getCreatureStorage(cid, d) > 0 then
doSendMagicEffect(getThingPos(cid), CONST_ME_POFF)
doPlayerSendCancel(cid,'Your mirror shield still has '.. getCreatureStorage(cid, d) ..' charges.')
return false
end
doCreatureSetStorage(cid, d, getShieldCharges(cid, mage_array))
doSendMagicEffect(getThingPos(cid), CONST_ME_MAGIC_GREEN)
doPlayerSendCancel(cid,'You have just enabled your mirror shield with '.. getCreatureStorage(cid, d) ..' charges.')
return true
end]]>
</text><vocation id="1;8"/>
</instant>
</mod>