• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Lua Spell with element protection

Antharaz

New Member
Joined
Jan 28, 2010
Messages
27
Reaction score
0
I'm using TFS 0.3.6 and i'm treying to do a spell that absorb X of an element, like fire, light, etc...

I've searched at forum and 000-constant.lua for a condition param about it, but i did'nt found anything that could help me :X

If anyone could give me a solution, i'll be grateful.

PS:.. i know my english is poor, sry :x
 
Solution
As far as I know (it isn't too much anyway), you can't do this without server source editing since there's only absorb attributes for monsters and equipment.

Sorry bro.
As far as I know (it isn't too much anyway), you can't do this without server source editing since there's only absorb attributes for monsters and equipment.

Sorry bro.
 
Solution
I found something like that.
XML:
<?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>
 
Back
Top