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

NPC doesn't count

auda

Advanced OT User
Joined
Jun 29, 2014
Messages
273
Reaction score
233
Location
Sweden
My NPC who sell fluids, blank runes and buy empty vials. The problem here is that he doesn't count, as for example:
13:14 Gamemaster Auda: sell 5 vials
13:14 Icarus: Do you want to sell each 5 vials for 5 gold?

The code:
Code:
_state = 0
_count = 0
_index = 0
_delay = 1000

items = {}
items[0] = {name = 'blank rune', id = 2260, subtype = -1, sell = 10}
items[1] = {name = 'mana fluid', id = 2006, subtype = 7, sell = 50}
items[2] = {name = 'life fluid', id = 2006, subtype = 10, sell = 45}
items[3] = {name = 'vial', id = 2006, subtype =-1, buy = 5}
function getNext()
    nextPlayer = getQueuedPlayer()
    if (nextPlayer ~= nil) then
        if (getDistanceToCreature(nextPlayer) <= 4) then
            updateNpcIdle()
            setNpcFocus(nextPlayer)
            greet(nextPlayer, _delay * 3)
            return
        else
            getNext()
        end
    end


    setNpcFocus(0)
    resetNpcIdle()
end

local function onActionItem(action)
    if ((action == 'buy' and items[_index].sell == -1) or
        (action == 'sell' and items[_index].buy == -1)) then
        return
    end
   
    amount = ''
    suffix = ''
    plural = 'a'
   
    if (_count > 1) then
        amount = ' ' .. tostring(_count)
        suffix = 's'
        plural = ''
    end
   
    cost = items[_index].buy
    if (action == 'buy') then
        cost = items[_index].sell
    end
   
    selfSay('Do you want to ' .. action .. ' each ' .. plural .. amount .. ' ' .. items[_index].name .. suffix .. ' for ' .. cost .. ' gold?')
end

function _selfSay(message)
    selfSay(message, _delay)
    updateNpcIdle()
end

local function greet(cid, delay)
    selfSay('Hi there ' .. getCreatureName(cid) .. '.', delay)
end

function onCreatureAppear(cid)
end

function onCreatureDisappear(cid)
    if (getNpcFocus() == cid) then
        selfSay('See you.', _delay)
        getNext()
    else
        unqueuePlayer(cid)
    end
end

function onCreatureMove(cid, oldPos, newPos)
    if (getNpcFocus() == cid) then
        faceCreature(cid)
    end
end

function onCreatureSay(cid, type, msg)
    if (getNpcFocus() == 0) then
        if ((msgcontains(msg, 'hi') or msgcontains(msg, 'hello')) and getDistanceToCreature(cid) <= 4) then
            updateNpcIdle()
            setNpcFocus(cid)
            greet(cid, _delay)
        end
       
    elseif (getNpcFocus() ~= cid) then
        if ((msgcontains(msg, 'hi') or msgcontains(msg, 'hello')) and getDistanceToCreature(cid) <= 4) then
            selfSay('Just wait, ' .. getCreatureName(cid) .. '.', _delay)
            queuePlayer(cid)
        end
       
    else
        if (msgcontains(msg, 'bye')) then
            selfSay('See you.', _delay)
            getNext()
       
        elseif (msgcontains(msg, 'name')) then
            _selfSay('I am Icarus')
       
        elseif (msgcontains(msg, 'job')) then
            _selfSay('I study the art of spellcasting and conjuring.')
       
        elseif (msgcontains(msg, 'king') or msgcontains(msg, 'calvin')) then
            _selfSay('I was kicked out of the city castle by Calvin himself for one slight miscalculation!')
       
        elseif (msgcontains(msg, 'ferumbras')) then
            _selfSay('We do not speak of him here...')
       
        elseif (msgcontains(msg, 'meadowfield')) then
            _selfSay('Hmpf!')
       
        elseif (msgcontains(msg, 'offer') or msgcontains(msg, 'goods')) then
            _selfSay('I\'m selling runes and fluids.')
           
        elseif (msgcontains(msg, 'rune') and not(msgcontains(msg, 'blank'))) then
            _selfSay('I only sell blank runes, for the sake of security.')
           
        elseif (_state == 1) then
            if (msgcontains(msg, 'yes')) then
                if (doPlayerRemoveMoney(cid, items[_index].sell * _count) == 1) then
                    for i = 1, _count do
                        doPlayerAddItem(cid, items[_index].id, items[_index].subtype)
                    end
               
                    selfSay('Here you are.', _delay)
                else
                    selfSay('Come back down here when you have money.', _delay)
                end
               
                updateNpcIdle()
            else
                selfSay('Hmm.', _delay)
            end
           
            _state = 0
           
        elseif (_state == 2) then
            if (msgcontains(msg, 'yes')) then
                if (doPlayerRemoveItem(cid, items[_index].id, _count, items[_index].subtype) == 1) then
                    doPlayerAddMoney(cid, items[_index].buy * _count)
                    selfSay('Ok. Here is your money.')
                else
                    if (count > 1) then
                        selfSay('Sorry, you do not have so many.', _delay)
                    else
                        selfSay('Sorry, you do not have one.', _delay)
                    end
                end
               
                updateNpcIdle()
            else
                selfSay('Perhaps another time.', _delay)
            end
       
            _state = 0
           
        else
            for n = 0, table.getn(items) do
                if (msgcontains(msg, items[n].name) or msgcontains(msg, items[n].name .. "s")) then
                    _count = getCount(msg)
                    _index = n
                   
                    if (msgcontains(msg, 'sell')) then
                        onActionItem('sell')
                        _state = 2
                    else
                        onActionItem('buy')
                        _state = 1
                    end
                   
                    updateNpcIdle()
                    break
                end
            end
        end
    end
end

function onThink()
    if (getNpcFocus() ~= 0) then
        if (isNpcIdle() or getDistanceToCreature(getNpcFocus()) > 4) then
            selfSay('See you.', _delay)
            getNext()
        end
    end
end

Thanks a lot for all the help I've gotten so far.
 
Back
Top