Mirror && Ultimate Shields: SP Edition with 3 counterattacks+MOD
1361 > Used to count the charges of the druid´s shield.
1362 > Used to count the charges of the knight´s shield.
Description:
These are the Mirror and Absolute shields which protect the player from any elemental-based attacks, no matter they are direct or area-based, this defense nullifies any elemental attack. Both shields have charges, and can be recharged when the user casts the spell.
The first shield, which is for druids, reflects elemental attacks to the attacker, working as a mirror shield. The attack of the reflected attack depends of caster´s ML. The higher the druid´s ML is, more charges the druid gets. You can choose between these three counterattacks:
-'damage' : counterattacks with the same value of damage to attacker, and same element.
-'condition' : counterattacks adding a condition depending of the element-based attack by the target. The condition consists of 5 rounds of 2 seconds with -10 of damage. Burned, dazzled, poisoned, frozen, energy or cursed.
-'both' : both counterattacks just mentioned(damage and condition)
The other shield for knights just nullifies the attack. The higher the knight´s magic level is, more charges the knight gets.
MOD: mods/shield.xml
LUA Setup (If you use MOD you don't need these!)
> data/creaturescripts/creaturescripts.xml
> data/creaturescripts/scripts/login.lua
> data/creaturescripts/scripts/shield.lua
> data/spells/scripts/mageshield.lua
> data/spells/scripts/kinashield.lua
> data/spells/spells.xml
eace:
Energy | Earth | Poison | Fire | Ice | Holy | Death
* *\ /* *\
*_____* *________* *|* *________* *\_____*/
****** Mirror && Ultimate Shields ******/
** ** SP Edition by Cybermaster ** **/
****** * | * ******/
* *|* */
**/ \**/
*****/
*
* *\ /* *\
*_____* *________* *|* *________* *\_____*/
****** Mirror && Ultimate Shields ******/
** ** SP Edition by Cybermaster ** **/
****** * | * ******/
* *|* */
**/ \**/
*****/
*
Author: Cybermaster
Storages:
1361 > Used to count the charges of the druid´s shield.
1362 > Used to count the charges of the knight´s shield.
Description:
These are the Mirror and Absolute shields which protect the player from any elemental-based attacks, no matter they are direct or area-based, this defense nullifies any elemental attack. Both shields have charges, and can be recharged when the user casts the spell.
The first shield, which is for druids, reflects elemental attacks to the attacker, working as a mirror shield. The attack of the reflected attack depends of caster´s ML. The higher the druid´s ML is, more charges the druid gets. You can choose between these three counterattacks:
-'damage' : counterattacks with the same value of damage to attacker, and same element.
-'condition' : counterattacks adding a condition depending of the element-based attack by the target. The condition consists of 5 rounds of 2 seconds with -10 of damage. Burned, dazzled, poisoned, frozen, energy or cursed.
-'both' : both counterattacks just mentioned(damage and condition)
The other shield for knights just nullifies the attack. The higher the knight´s magic level is, more charges the knight gets.
MOD: mods/shield.xml
Lua:
<?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[
--[[
* *\ /* *\
*_____* *________* *|* *________* *\_____*/
****** Mirror && Ultimate Shields ******/
** ** SP Edition by Cybermaster ** **/
****** *MOD* ******/
* *|* */
**/ \**/
*****/
*
]]--
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)
--[[ AVAILABLE OPTIONS FOR MIRROR SHIELD'S COUNTERATTACK:
'damage' : counterattacks with the same value of damage to attacker, and same element.
'condition' : counterattacks adding a condition depending of the element-based attack by the target. The condition consists of 5 rounds of 2 seconds with -10 of damage. Burned, dazzled, poisoned, frozen, energy or cursed.
'both' : both counterattacks just mentioned(damage and condition) ]]--
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="4;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="2;6"/>
</instant>
</mod>
LUA Setup (If you use MOD you don't need these!)
> data/creaturescripts/creaturescripts.xml
Lua:
<event type="statschange" name="shield" event="script" value="shield.lua"/>
> data/creaturescripts/scripts/login.lua
Lua:
registerCreatureEvent(cid, "shield")
> data/creaturescripts/scripts/shield.lua
Lua:
--[[
* *\ /* *\
*_____* *________* *|* *________* *\_____*/
****** Mirror && Ultimate Shields ******/
** ** SP Edition by Cybermaster ** **/
****** * | * ******/
* *|* */
**/ \**/
*****/
*
]]--
local energy = createConditionObject(CONDITION_ENERGY)
setConditionParam(energy, CONDITION_PARAM_DELAYED, 1)
addDamageCondition(energy, 5, 2000, -10)
local poison = createConditionObject(CONDITION_POISON)
setConditionParam(poison, CONDITION_PARAM_DELAYED, 1)
addDamageCondition(poison, 5, 2000, -10)
local fire = createConditionObject(CONDITION_FIRE)
setConditionParam(fire, CONDITION_PARAM_DELAYED, 1)
addDamageCondition(fire, 5, 2000, -10)
local freezing = createConditionObject(CONDITION_FREEZING)
setConditionParam(freezing, CONDITION_PARAM_DELAYED, 1)
addDamageCondition(freezing, 5, 2000, -10)
local dazzled = createConditionObject(CONDITION_DAZZLED)
setConditionParam(dazzled, CONDITION_PARAM_DELAYED, 1)
addDamageCondition(dazzled, 5, 2000, -10)
local cursed = createConditionObject(CONDITION_CURSED)
setConditionParam(cursed, CONDITION_PARAM_DELAYED, 1)
addDamageCondition(cursed, 5, 2000, -10)
local mirrorCounterAttack = 'damage' --OPTIONS: 'condition'/'damage'/'both'
local e,d,k = { --combat type and distance shoot effect, and storages
[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, --druid
1362 --kina
function doKinaShield(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 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
doKinaShield(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
> data/spells/scripts/mageshield.lua
Lua:
--storage to store the charges of druid's mirror shield & charges by magic level
local storage, d = 1361, {{20, 1},{60, 2},{100, 3}}
function getShieldCharges(cid)
table.sort(d, function(a, b) return a[1] > b[1] end)
for _, t in ipairs(d) do
if getPlayerMagLevel(cid) >= t[1] then
return t[2]
end
end
return d[1][2]
end
function onCastSpell(cid, var)
if getCreatureStorage(cid, storage) > 0 then
doSendMagicEffect(getThingPos(cid), CONST_ME_POFF)
doPlayerSendCancel(cid,'Your mirror shield still has '.. getCreatureStorage(cid, storage) ..' charges.')
return false
end
doCreatureSetStorage(cid, storage, getShieldCharges(cid))
doSendMagicEffect(getThingPos(cid), CONST_ME_MAGIC_GREEN)
doPlayerSendCancel(cid,'You have just enabled your mirror shield with '.. getCreatureStorage(cid, storage) ..' charges.')
return true
end
> data/spells/scripts/kinashield.lua
Lua:
--storage to store the charges of knight's ultimate shield & charges by magic level
local storage, d = 1362, {{2, 1},{6, 2},{10, 3}}
function getShieldCharges(cid)
table.sort(d, function(a, b) return a[1] > b[1] end)
for _, t in ipairs(d) do
if getPlayerMagLevel(cid) >= t[1] then
return t[2]
end
end
return d[1][2]
end
function onCastSpell(cid, var)
if getCreatureStorage(cid, storage) > 0 then
doSendMagicEffect(getThingPos(cid), CONST_ME_POFF)
doPlayerSendCancel(cid,'Your ultimate shield still has '.. getCreatureStorage(cid, storage) ..' charges.')
return false
end
doCreatureSetStorage(cid, storage, getShieldCharges(cid))
doSendMagicEffect(getThingPos(cid), CONST_ME_MAGIC_GREEN)
doPlayerSendCancel(cid,'You have just enabled your ultimate shield with '.. getCreatureStorage(cid, storage) ..' charges.')
return true
end
> data/spells/spells.xml
Lua:
<instant name="Ultimate Shield" words="utamo max" lvl="60" mana="200" prem="0" exhaustion="2000" needlearn="0" script="kinashield.lua">
<vocation id="4"/>
<vocation id="8"/>
</instant>
<instant name="Mirror Shield" words="utamo gran" lvl="60" mana="600" prem="0" exhaustion="2000" needlearn="0" script="mageshield.lua">
<vocation id="2"/>
<vocation id="6"/>
</instant>
eace:
Last edited: