• 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 Talkaction - doPlayerCastSpell

tiag0_bn

Well-Known Member
Joined
Dec 8, 2011
Messages
181
Reaction score
50
Good afternoon, I have a script that needs an adjustment ... I added the doPlayerCastSpell function and it doesn't cast runes and ammo...

say spell but not conjure

doPlayer fuction

my script

Lua:
local function trainMana(cid, startTime)
    if not isPlayer(cid) then
        players[cid] = nil
        return
    end
    if not players[cid] or players[cid][3] ~= startTime then
        return
    end
    if getCreatureMana(cid) >= players[cid][2] then
        if not doPlayerCastSpell(cid, players[cid][1]) then
            doCreatureSay(cid, "Cannot cast spell.")
            players[cid] = nil
            return
        end
        local mana = getInstantSpellInfo(cid, players[cid][1]).mana
        doCreatureAddMana(cid, -(mana), false)
        doPlayerAddSpentMana(cid, mana, true)
        doCreatureSay(cid, getInstantSpellInfo(cid, players[cid][1]).words, TALKTYPE_MONSTER_SAY)
    end
    if getPlayerFood(cid) < 10 then -- if less then 10 seconds of food time left
        autoEat(cid)
    end
    --doPlayerSetIdleTime(cid, 0)
    addEvent(trainMana, 3000, cid, startTime)
end
 
OTX (1.1.X.S - 4) -

script full


Lua:
local players = {}
local FOODS, MAX_FOOD = {
    [2328] = {84, "Gulp."},  [2362] = {48, "Yum."}, [2666] = {180, "Munch."}, [2667] = {144, "Munch."},
    [2668] = {120, "Mmmm."}, [2669] = {204, "Munch."}, [2670] = {48, "Gulp."}, [2671] = {360, "Chomp."},
    [2672] = {720, "Chomp."}, [2673] = {60, "Yum."}, [2674] = {72, "Yum."}, [2675] = {156, "Yum."},
    [2676] = {96, "Yum."}, [2677] = {12, "Yum."}, [2678] = {216, "Slurp."}, [2679] = {12, "Yum."},
    [2680] = {24, "Yum."}, [2681] = {108, "Yum."}, [2682] = {240, "Yum."}, [2683] = {204, "Munch."},
    [2684] = {60, "Crunch."}, [2685] = {72, "Munch."}, [2686] = {108, "Crunch."}, [2687] = {24, "Crunch."},
    [2688] = {24, "Mmmm."}, [2689] = {120, "Crunch."}, [2690] = {72, "Crunch."}, [2691] = {96, "Crunch."},
    [2695] = {72, "Gulp."}, [2696] = {108, "Smack."}, [8112] = {108, "Urgh."}, [2787] = {108, "Crunch."},
    [2788] = {48, "Munch."}, [2789] = {264, "Munch."}, [2790] = {360, "Crunch."}, [2791] = {108, "Crunch."},
    [2792] = {72, "Crunch."}, [2793] = {144, "Crunch."}, [2794] = {36, "Crunch."}, [2795] = {432, "Crunch."},
    [2796] = {300, "Crunch."}
}, 1200

local function autoEat(cid)
    for food, foodinfo in pairs(FOODS) do
        if getPlayerItemCount(cid, food) > 0 then
            if getPlayerFood(cid) + foodinfo[1] * 3 < MAX_FOOD then
                doPlayerFeed(cid, foodinfo[1])
                doPlayerRemoveItem(cid, food, 1)
                doCreatureSay(cid, foodinfo[2], TALKTYPE_MONSTER)
            end
            break
        end
    end
end

local function trainMana(cid, startTime)
    if not isPlayer(cid) then
        players[cid] = nil
        return
    end
    if not players[cid] or players[cid][3] ~= startTime then
        return
    end
    if getCreatureMana(cid) >= players[cid][2] then
        if not doCreatureCastSpell(cid, players[cid][1]) then
            doCreatureSay(cid, "Cannot cast spell.")
            players[cid] = nil
            return
        end
        local mana = getInstantSpellInfo(cid, players[cid][1]).mana
        doCreatureAddMana(cid, -(mana), false)
        doPlayerAddSpentMana(cid, mana, true)
        doCreatureSay(cid, getInstantSpellInfo(cid, players[cid][1]).words, TALKTYPE_MONSTER_SAY)
    end
    if getPlayerFood(cid) < 10 then -- if less then 10 seconds of food time left
        autoEat(cid)
    end
    --doPlayerSetIdleTime(cid, 0)
    addEvent(trainMana, 1000, cid, startTime)
end

local function showSpellList(cid)
    local t = {}
    for i = 0, getPlayerInstantSpellCount(cid) - 1 do
        local spell = getPlayerInstantSpellInfo(cid, i)
        if(spell.mlevel ~= 0) then
            if(spell.manapercent > 0) then
                spell.mana = spell.manapercent .. "%"
            end
    
            table.insert(t, spell)
        end
    end
    
    table.sort(t, function(a, b) return a.mlevel < b.mlevel end)
    local text, prevLevel = "", -1
    for i, spell in ipairs(t) do
        local line = ""
        if(prevLevel ~= spell.mlevel) then
            if(i ~= 1) then
                line = "\n"
            end
            line = line .. "Spells for Magic Level " .. spell.mlevel .. "\n"
            prevLevel = spell.mlevel
        end
        text = text .. line .. "  " .. spell.words .. " - " .. spell.name .. " : " .. spell.mana .. "\n"
    end
    doShowTextDialog(cid, 2175, text)
end


function onSay(cid, words, param, channel)
    if players[cid] then
        if players[cid][3] == os.time() then
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Training cannot be stopped this quickly. Please wait a few seconds.")
            return true
        end
        players[cid] = nil
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Training has been stopped.")
        return true
    end
    
    if param == "" then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Spell name and mana threshold required. Ex: !train Light Healing, 400 | !train list -> will show list of owned spells")
        return true
    elseif param == "list" then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Here is a list of your current spells.")
        showSpellList(cid)
        return true
    end
    
    local t = string.explode(param, ",")
    if t[1] == nil or t[2] == nil then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Spell name and mana threshold required. Ex: !train Light Healing, 400")
        return true
    end
    t[1] = t[1]:lower()
    
    local spell
    for i = 0, getPlayerInstantSpellCount(cid) - 1 do
        spell = getPlayerInstantSpellInfo(cid, i)
        if spell.name:lower() == t[1] or spell.words:lower() == t[1] then
            t[1] = spell.name:lower()
            spell = true
            break
        end
    end
    
    if spell ~= true then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "The spell (" .. t[1] .. ") does not exist.")
        return true
    end
    
    local manaThreshold = tonumber(t[2])
    if manaThreshold == nil then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "The mana threshold chosen (" .. t[2] .. ") is not a known number. Mana threshold has been set to your maximum mana.")
        manaThreshold = getCreatureMaxMana(cid)
    end
    
    manaThreshold = math.floor(manaThreshold) -- to get rid of any decimals player might have thrown in
    if manaThreshold < 0 or manaThreshold < getInstantSpellInfo(cid, t[1]).mana then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "The mana threshold chosen (" .. t[2] .. ") is lower then the spell cost of the spell (" .. t[1] .. "). Mana threshold has been set to your maximum mana.")
        manaThreshold = getCreatureMaxMana(cid)
    elseif manaThreshold > getCreatureMaxMana(cid) then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "The mana threshold chosen (" .. t[2] .. ") is higher then your maxmimum mana. Mana threshold has been set to your maximum mana.")
        manaThreshold = getCreatureMaxMana(cid)
    end
    
    players[cid] = {getInstantSpellInfo(cid, t[1]).name, manaThreshold, os.time()}   
    doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Training has started! Spell: (" .. t[1] .. "), Mana Threshold: " .. manaThreshold .. "")
    trainMana(cid, os.time())
    return true
end
 
Last edited:
Back
Top