• 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!

[TFS 1.3+] Multi-target "star shooter" updated script

Dip Set

Veteran OT User
Joined
Dec 27, 2007
Messages
405
Solutions
2
Reaction score
369
Original Credits + instructions -- [weapon]Multitarget wand 'star shoter' (https://otland.net/threads/weapon-multitarget-wand-star-shoter.13967/)
Credits to the legend @Gesior.pl
Works on TFS 1.3+ without errors.
Lua:
local combat = createCombatObject()

setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 0)

setCombatParam(combat, COMBAT_PARAM_BLOCKSHIELD, 0)

setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)

setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYDAMAGE)

setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY)

setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -0.2, -25, -0.2, -3)



local manaNeededPerTarget = 2

local hitExtraTargets = 2 -- number of extra targets, so it should attack our target + X other monsters/players

local hitExtraTargetsInRange = 2 -- distance to 'extra target' from our target





function onUseWeapon(cid, var)

    local ret = doCombat(cid, combat, var)

    if(ret == LUA_ERROR) then

        return LUA_ERROR

    end

    local manaSpent = manaNeededPerTarget

    local target = variantToNumber(var)

    local hitplayers = false

    if(target ~= 0) then

        if(isPlayer(target)) then

            hitplayers = true

        end

        local otherTargets = getSpectators(getCreaturePosition(target), hitExtraTargetsInRange, hitExtraTargetsInRange, false)

        if(#otherTargets > 0) then

            local i = 1

            while(i ~= #otherTargets) do

                local pid = otherTargets[i]

                if(isNpc(pid) or pid == cid or pid == target or (isPlayer(pid) and (not hitplayers or getTileInfo(getCreaturePosition(pid)).protection))) then

                    table.remove(otherTargets, i)

                else

                    i = i + 1

                end

            end

        end

        for i = 1, hitExtraTargets do

            if(#otherTargets > 0 and getPlayerMana(cid) >= manaSpent + manaNeededPerTarget) then

                local randomId = math.random(1, #otherTargets)

                local nowHit = otherTargets[randomId]

                table.remove(otherTargets, randomId)

                ret = doCombat(cid, combat, numberToVariant(nowHit))

                if(ret ~= LUA_ERROR) then

                    manaSpent = manaSpent + manaNeededPerTarget

                end

            else

                break

            end

        end

    end

    doPlayerAddMana(cid, -manaSpent)

    return true

end


Known bugs --
1. when attacking single target, it will take the mana of two targets
for example: when attacking 1 monster it SHOULD take 2 mana, but instead takes 4 mana, when attacking 2 targets it takes 4 mana, when attacking 3 targets it takes 6 mana.
2. doesn't actually add magic level, instead adds distance fighting.
for example: at magic level 0 you will stay magic level 0, but at distance 10, you will increase to distance 11,12, etc.
3. shoots even with 0 mana.

EDIT - fix for #2, instead of making it distance weapon in weapons.xml, make it a wand

Lua:
    <wand id="1111" script="starshoter.lua" level="7"> <!-- Star Shoter -->
        <vocation name="Druid" />
    </wand>
 
Last edited:
Back
Top