Ir para conteúdo

Advanced Npc System 2.04


tibiaa4e

Posts Recomendados

Esse script eu num entendi prefiro 10 mil x por c++

 

Maas os cara dos ots usam ele muito e por isso existem mtos npcs a +

 

vou postar ele aqui

 

Em global.lua add no final :

ITEM_GOLD_COIN = 2148

ITEM_PLATINUM_COIN = 2152

ITEM_CRYSTAL_COIN = 2160

 

function doPlayerGiveItem(cid, itemid, stackable, count)

    while count > 0 do

        local tempcount = 0

        if(stackable == true) then

            tempcount = math.min (100, count)

        else

              tempcount = 1

          end

          local ret = doPlayerAddItem(cid, itemid, tempcount)

          if(ret == LUA_ERROR) then

            ret = doCreateItem(itemid, tempcount, getPlayerPosition(cid))

        end

       

        if(ret ~= LUA_ERROR) then

            count = count-tempcount

        else

            return LUA_ERROR

        end

    end

    return LUA_NO_ERROR

end

 

function doPlayerTakeItem(cid, itemid, stackable, count)

    if(getPlayerItemCount(cid,itemid) >= count) then

       

        while count > 0 do

            local tempcount = 0

            if(stackable == true) then

                tempcount = math.min (100, count)

            else

                tempcount = 1

            end

            local ret = doPlayerRemoveItem(cid, itemid, tempcount)

           

            if(ret ~= LUA_ERROR) then

                count = count-tempcount

            else

                return LUA_ERROR

            end

        end

       

        if(count == 0) then

            return LUA_NO_ERROR

        end

       

    else

        return LUA_ERROR

    end

end

 

 

function doPlayerAddMoney(cid, amount)

    local crystals = math.floor(amount/10000)

    amount = amount - crystals*10000

    local platinum = math.floor(amount/100)

    amount = amount - platinum*100

    local gold = amount

    local ret = 0

    if(crystals > 0) then

        ret = doPlayerGiveItem(cid, ITEM_CRYSTAL_COIN, true, crystals)

        if(ret ~= LUA_NO_ERROR) then

            return LUA_ERROR

        end

    end

    if(platinum > 0) then

        ret = doPlayerGiveItem(cid, ITEM_PLATINUM_COIN, true, platinum)

        if(ret ~= LUA_NO_ERROR) then

            return LUA_ERROR

        end

    end

    if(gold > 0) then

        ret = doPlayerGiveItem(cid, ITEM_GOLD_COIN, true, gold)

        if(ret ~= LUA_NO_ERROR) then

            return LUA_ERROR

        end

    end

    return LUA_NO_ERROR

end

 

 

function doPlayerBuyItem(cid, itemid, stackable, count, price)

    if(doPlayerRemoveMoney(cid, price) == TRUE) then

        return doPlayerGiveItem(cid, itemid, stackable, count)

    else

        return LUA_ERROR

    end

end

 

function doPlayerBuyRune(cid, itemid, count, charges, price)

    if(doPlayerRemoveMoney(cid, price) == TRUE) then

        local ret = 0

        for i = 1, count do

            ret = doPlayerGiveItem(cid, itemid, true, charges)

        end

        return ret

        --return doPlayerGiveItem(cid, itemid, true, charges)

    else

        return LUA_ERROR

    end

end

 

 

function doPlayerSellItem(cid, itemid, stackable, count, price)

   

    if(doPlayerTakeItem(cid, itemid, stackable, count) == LUA_NO_ERROR) then

        doPlayerAddMoney(cid, price)

        return LUA_NO_ERROR

    else

        return LUA_ERROR

    end

   

end

 

no data/npc/scripts/lib/npc.lua:

add

TALKSTATE_NONE = 0

TALKSTATE_SELL_ITEM = 1

TALKSTATE_BUY_ITEM = 2

 

-- get the distance to a creature

function getDistanceToCreature(id)

    if id == 0 or id == nil then

        --

        return 0

    end

    local cx, cy, cz = creatureGetPosition(id)

    if cx == nil then

        return 100

    end

   

    local sx, sy, sz = selfGetPosition()

   

    if(cz ~= sz) then

        return 100

    end

   

    return math.max(math.abs(sx-cx), math.abs(sy-cy))   

end

 

-- do one step to reach position

function moveToPosition(x,y,z)

    selfMoveTo(x, y, z)

end

 

-- do one step to reach creature

function moveToCreature(id)

    if id == 0 or id == nil then

        selfGotoIdle()

    end

    local tx,ty,tz=creatureGetPosition(id)

    if tx == nil then

        --

    else

      moveToPosition(tx, ty, tz)

  end

end

 

 

 

CustomerQueue = {

    customers = nil,

    handler = nil

}

 

function CustomerQueue:new(o)

    o = o or {}  -- create object if user does not provide one

    setmetatable(o, self)

    self.__index = self

    return o

end

 

 

function CustomerQueue:removeFirst()

    table.remove(self.customers, 1)

end

 

function CustomerQueue:pushBack(cid)

    table.insert(self.customers, cid)

end

 

function CustomerQueue:getFirst()

    return self.customers[1]

end

 

function CustomerQueue:isInQueue(id)

    local pos = 1

    while true do

        local value = self.customers[pos]

        if value == nil then

            return false

        else

            if value == id then

                return true

            end

        end

        pos = pos+1

    end

    return false

end

 

function CustomerQueue:isEmpty()

    return (self:getFirst() == nil)

end

 

 

function CustomerQueue:greet(cid)

    selfSay('Hello, ' .. creatureGetName(cid) .. '! What a pleasent surprise.')

    self.handler:resetNpc()

    self.handler.focus = cid

    self.handler.talkStart = os.clock()

end

 

function CustomerQueue:canGreet(cid)

    local cx, cy, cz = creatureGetPosition(cid)

    if cx == nil then

        return false

    end

   

    local sx, sy, sz = selfGetPosition()

    local dist = math.max(math.abs(sx-cx), math.abs(sy-cy))

   

    return (dist <= 4 and sz == cz)

   

end

 

 

 

function CustomerQueue:greetNext()

    while true do

        local first = self:getFirst()

        if(first == nil) then

            return false

        end

       

        if(not self:canGreet(first)) then

            self:removeFirst()

        else

            self:greet(first)

            self:removeFirst()

            return true

        end

        return true

    end

    return false

end

 

 

 

 

 

function getCount(msg)

    local ret = 1

    local b, e = string.find(msg, "%d+")

    if b ~= nil and e ~= nil then

      ret = tonumber(string.sub(msg, b, e))

    end

   

    return ret

end

 

 

 

function msgContains(message, keyword)

    return string.find(message, '(%a*)' .. keyword .. '(%a*)')

end

 

 

 

function walk(lastmove, spawn, dist)

 

if(dist <= 0) then

  return 0

end

 

if(os.time() - lastmove > 1) then

  local dir = math.random (0,3)

  sx, sy, sz = selfGetPosition()

 

  if(dir == DIRECTION_NORTH and (spawn.y-sy) >= dist) then

  return lastmove

  end

  if(dir == DIRECTION_SOUTH and (sy-spawn.y) >= dist) then

  return lastmove

  end

  if(dir == DIRECTION_EAST and (sx-spawn.x) >= dist) then

  return lastmove

  end

  if(dir == DIRECTION_WEST and (spawn.x-sx) >= dist) then

  return lastmove

  end

 

  selfMove(dir)

  lastmove = os.time()

end

return lastmove

end

 

function turnToCreature(cid, lastPos)

    local pos = getPlayerPosition(cid)

    local sx, sy, sz = selfGetPosition()

    if(pos == nil or sx == nil) then

        return

    else

       

        local dx = sx - pos.x

        local dy = sy - pos.y

       

        local direction = 0;

        local tan = 0;

        if(dx ~= 0) then

            tan = dy/dx;

        else

            tan = 10;

        end

       

        if(math.abs(tan) < 1) then

            if(dx > 0) then

                direction = 3;

            else

                direction = 1;

            end       

       

        else

            if(dy > 0) then

                direction = 0;

            else

                direction = 2;

            end

        end

       

        selfTurn(direction)

       

    end

end

 

 

 

 

KeywordLevel = {

    keywords = {},

    --children = {},

    func = nil,

    parameters = {}

}

 

function KeywordLevel:new(o)

    o = o or {}  -- create object if user does not provide one

    setmetatable(o, self)

    self.__index = self

    return o

end

 

function KeywordLevel:processMessage(cid, message)

    local i = 1

    while true do

        local key = self.keywords

        if(key == nil) then

            break

        end

       

        if(not self:checkKeyword(message, key)) then

            return false

        end

       

        i = i+1

    end

   

    if(self.func == nil) then

        return true

    end

   

   

    return self.func(cid, message, self.keywords, self.parameters)

end

 

 

function KeywordLevel:checkKeyword(message, key)

    return msgContains(message, key)

end

 

 

KeywordHandler = {

    root = {}

}

 

function KeywordHandler:new(o)

    o = o or {}  -- create object if user does not provide one

    setmetatable(o, self)

    self.__index = self

    return o

end

 

function KeywordHandler:processMessage(cid, message)

   

    local ret = false

    local i = 1

    while true do

        local key = self.root

        if(key == nil) then

            return false

        end

        ret = key:processMessage(cid, message)

        if(ret) then

            return ret

        end

        i = i+1

    end

   

    return false

end

 

function KeywordHandler:addKeyword(keys, f, params)

    local new = KeywordLevel:new(nil)

    new.keywords = keys

    new.func = f

    new.parameters = params

    table.insert(self.root, new)

end

 

 

-- NpcHandler class start

NpcHandler = {

    started = false,

    focus = 0,

    talkState = 0,

    talkStart = 0,

    lastPos = nil,

    lastMove = 0,

    queue = nil,

    keywordHandler = nil

}

 

function NpcHandler:new(o)

    o = o or {}  -- create object if user does not provide one

    setmetatable(o, self)

    self.__index = self

    return o

end

 

 

function NpcHandler:resetNpc()

    self.focus = 0

    self.talkState = 0

    self.talkStart = 0

end

 

function NpcHandler:onThingMove(creature, thing, oldpos, oldstackpos)

end

function NpcHandler:onCreatureAppear(creature)

end

function NpcHandler:onCreatureDisappear(cid)

end

function NpcHandler:onCreatureSay(cid, type, msg)

end

function NpcHandler:onThink()

end

 

 

function NpcHandler:init(costumerQueue, newKeywordHandler)

    if(self.started) then

        return

    end

   

    self.queue = costumerQueue

    self.keywordHandler = newKeywordHandler

    self:resetNpc()

   

    self.started = true

end

-- NpcHandler class end

 

 

 

 

-- ShopHandler class start

ShopNpcHandler = {

    itemid = 0,

    count = 0,

    charges = 0,

    cost = 0,

    stackable = false,

    walkDistance = 5,

    spawnPos = nil

}

ShopNpcHandler = NpcHandler:new(ShopNpcHandler)

 

 

function ShopNpcHandler:setActiveItem(itemid, count, charges, cost, stackable)

    self.itemid = itemid

    self.count = count

    self.charges = charges

    self.cost = cost

    self.stackable = stackable

end

 

function ShopNpcHandler:resetNpc()

    self.focus = 0

    self.talkState = 0

    self.talkStart = 0

   

    self.itemid = 0

    self.count = 0

    self.charges = 0

    self.cost = 0

    self.stackable = false

end

 

 

 

function ShopNpcHandler:onCreatureDisappear(cid)

    if(cid == self.focus) then

        self:resetNpc()

        self.queue:greetNext()

    end

end

 

function ShopNpcHandler:onCreatureSay(cid, type, msg)

   

    --Only allow players...

    if(isPlayer(cid) == 0) then

        return

    end

   

    local dist = getDistanceToCreature(cid)

    if dist > 4 then

        return

    end

   

    msg = string.lower(msg)

   

    if cid == self.focus then

        self.talkStart = os.clock()

    end 

    local ret = self.keywordHandler:processMessage(cid, msg)

    if(ret == true) then

        return

    end

   

    if(cid == self.focus and self.talkState ~= TALKSTATE_NONE) then

        selfSay('I guess not then.')

        self.talkState = TALKSTATE_NONE

        return

    end

   

end

 

 

function ShopNpcHandler:onThink()

   

    if (os.clock() - self.talkStart) > 25 then

        if self.focus > 0 then

            selfSay('Next please!')

        end

       

        self:resetNpc()

       

        self.queue:greetNext()

    end

   

    local dist = getDistanceToCreature(self.focus)

    if dist > 4 then

        selfSay('Next please!')

        self:resetNpc()

        self.queue:greetNext()

    end

   

   

   

    if self.focus == 0 then

  if(self.spawnPos == nil) then

  local sx, sy, sz = selfGetPosition()

  self.spawnPos = {x = sx, y = sy, z = sz}

  end

  self.lastMove = walk(self.lastMove, self.spawnPos, self.walkDistance)

else

  self.lastPos = turnToCreature(self.focus, self.lastPos)

end

   

end

 

-- ShopHandler class end

 

 

-- Default shop keyword handling functions...

function ShopNpcHandler:defaultTradeHandler(cid, message, keywords, parameters)

    if self.focus ~= cid then

        return false

    end

   

    local tempcount = getCount(message)

    if(tempcount > 500) then

        tempcount = 500

    end

   

   

    local itemname = keywords[1]

    if(keywords[1] == 'sell') then

        itemname = keywords[2]

    end

   

    if(parameters.realname ~= nil) then

        itemname = parameters.realname

    end

   

    local tradeKeyword = 'buy'

    if(keywords[1] == 'sell') then

        tradeKeyword = 'sell'

    end

    selfSay('Do you want to ' .. tradeKeyword .. ' ' .. tempcount .. ' ' .. itemname .. ' for ' .. parameters.cost*tempcount .. ' gold coins?')

   

    if(keywords[1] == 'sell') then

        self.talkState = TALKSTATE_SELL_ITEM

    else

        self.talkState = TALKSTATE_BUY_ITEM

    end

   

    self:setActiveItem(parameters.itemid, tempcount, parameters.charges, tempcount*parameters.cost, (parameters.stackable ~= nil and parameters.stackable == true))

    return true

end

 

function ShopNpcHandler:defaultConfirmHandler(cid, message, keywords, parameters)

    if self.focus ~= cid then

        return false

    end

    if(keywords[1] == 'yes') then

        if(self.talkState == TALKSTATE_SELL_ITEM) then

            self.talkState = TALKSTATE_NONE

            local ret = doPlayerSellItem(self.focus, self.itemid, self.stackable, self.count, self.cost)

            if(ret == LUA_NO_ERROR) then

                selfSay('Thank you.')

            else

                selfSay('You do not have that item.')

            end

        elseif(self.talkState == TALKSTATE_BUY_ITEM) then

            self.talkState = TALKSTATE_NONE

            local ret = 0

            if(self.charges == nil or self.charges <= 1) then

                ret = doPlayerBuyItem(self.focus, self.itemid, self.stackable, self.count, self.cost)

            else

                ret = doPlayerBuyRune(self.focus, self.itemid, self.count, self.charges, self.cost)

            end

            if(ret == LUA_NO_ERROR) then

                selfSay('Here you go.')

            else

                selfSay('You do not have enough money.')

            end

        end

    elseif(keywords[1] == 'no') then

        if(self.talkState == TALKSTATE_SELL_ITEM) then

            selfSay('I wouldnt sell that either.')

              self.talkState = TALKSTATE_NONE

          elseif(self.talkState == TALKSTATE_BUY_ITEM) then

              selfSay('Too expensive you think?')

              self.talkState = TALKSTATE_NONE

          end

    end

   

    return true

end

 

function NpcHandler:defaultMessageHandler(cid, message, keywords, parameters)

    if(not parameters.onlyfocus or (parameters.onlyfocus and cid == self.focus)) then

        selfSay(parameters.text)

        self.talkState = TALKSTATE_NONE

        return true

    end

    return false

end

 

function NpcHandler:defaultGreetHandler(cid, message, keywords, parameters)

    if self.focus == cid then

        selfSay('I am already talking to you.')

        self.talkStart = os.clock()

    elseif self.focus > 0 or not(self.queue:isEmpty()) then

        selfSay('Please, ' .. creatureGetName(cid) .. '. Wait for your turn!.')

        if(not self.queue:isInQueue(cid)) then

            self.queue:pushBack(cid)

        end

    elseif(self.focus == 0) and (self.queue:isEmpty()) then

        selfSay('Hello, ' .. creatureGetName(cid) .. '. Welcome to my shop!')

        self.focus = cid

        self.talkStart = os.clock()

    end

   

    return true

end

 

function NpcHandler:defaultFarewellHandler(cid, message, keywords, parameters)

    if(cid == self.focus) then

        selfSay('Farewell, ' .. creatureGetName(cid) .. '!')

        self:resetNpc()

        self.queue:greetNext()

        return true

    end

    return false

end

 

-- End

 

(pode dar erros melhor apagar tudo q tenha lá)

 

 

Exemplos de npc:

 

Tools npc:

local internalCustomerQueue = {}

local keywordHandler = KeywordHandler:new({root = {}})

local npcHandler = ShopNpcHandler:new({})

local customerQueue = CustomerQueue:new({customers = internalCustomerQueue, handler = npcHandler})

npcHandler:init(customerQueue, keywordHandler)

 

 

-- OTServ event handling functions start

function onThingMove(creature, thing, oldpos, oldstackpos)    npcHandler:onThingMove(creature, thing, oldpos, oldstackpos) end

function onCreatureAppear(creature)                            npcHandler:onCreatureAppear(creature) end

function onCreatureDisappear(id)                                npcHandler:onCreatureDisappear(id) end

function onCreatureTurn(creature)                                npcHandler:onCreatureTurn(creature) end

function onCreatureSay(cid, type, msg)                        npcHandler:onCreatureSay(cid, type, msg) end

function onCreatureChangeOutfit(creature)                        npcHandler:onCreatureChangeOutfit(creature) end

function onThink()                                            npcHandler:onThink() end

-- OTServ event handling functions end

 

-- Keyword handling functions start

function tradeItem(cid, message, keywords, parameters)    return npcHandler:defaultTradeHandler(cid, message, keywords, parameters) end

function confirmAction(cid, message, keywords, parameters) return npcHandler:defaultConfirmHandler(cid, message, keywords, parameters) end

function sayMessage(cid, message, keywords, parameters)    return npcHandler:defaultMessageHandler(cid, message, keywords, parameters) end

function greet(cid, message, keywords, parameters)        return npcHandler:defaultGreetHandler(cid, message, keywords, parameters) end

function farewell(cid, message, keywords, parameters)        return npcHandler:defaultFarewellHandler(cid, message, keywords, parameters) end

-- Keyword handling functions end

 

 

-- Keyword structure generation start

keywordHandler:addKeyword({'rope'},    tradeItem, {itemid = 2120, cost = 50})

keywordHandler:addKeyword({'shovel'},    tradeItem, {itemid = 2554, cost = 10})

keywordHandler:addKeyword({'torch'},    tradeItem, {itemid = 2050, cost = 2})

keywordHandler:addKeyword({'pick'},    tradeItem, {itemid = 2553, cost = 40})

keywordHandler:addKeyword({'machete'},    tradeItem, {itemid = 2420, cost = 30})

keywordHandler:addKeyword({'scythe'},    tradeItem, {itemid = 2550, cost = 30})

 

keywordHandler:addKeyword({'yes'}, confirmAction, nil)

keywordHandler:addKeyword({'no'}, confirmAction, nil)

 

 

keywordHandler:addKeyword({'offer'},    sayMessage, {text = 'I sell ropes, shovels, torches, picks, machetes and scythes.', onlyfocus = true})

keywordHandler:addKeyword({'sell'},    sayMessage, {text = 'Why would I need that rubbish?', onlyfocus = true})

keywordHandler:addKeyword({'job'},    sayMessage, {text = 'I seel all kinds of tools.', onlyfocus = true})

keywordHandler:addKeyword({'quest'},    sayMessage, {text = 'A quest is nothing I want to be involved in.', onlyfocus = true})

keywordHandler:addKeyword({'mission'},sayMessage, {text = 'I cannot help you in that area, son.', onlyfocus = true})

keywordHandler:addKeyword({'buy'},        sayMessage, {text = 'Sorry but I do not sell those.', onlyfocus = true})

 

keywordHandler:addKeyword({'hi'}, greet, nil)

keywordHandler:addKeyword({'hello'}, greet, nil)

keywordHandler:addKeyword({'hey'}, greet, nil)

keywordHandler:addKeyword({'bye'}, farewell, nil)

keywordHandler:addKeyword({'farewell'}, farewell, nil)

 

Runeseller npc:

local internalCustomerQueue = {}

local keywordHandler = KeywordHandler:new({root = {}})

local npcHandler = ShopNpcHandler:new({})

local customerQueue = CustomerQueue:new({customers = internalCustomerQueue, handler = npcHandler})

npcHandler:init(customerQueue, keywordHandler)

 

 

-- OTServ event handling functions start

function onThingMove(creature, thing, oldpos, oldstackpos)    npcHandler:onThingMove(creature, thing, oldpos, oldstackpos) end

function onCreatureAppear(creature)                            npcHandler:onCreatureAppear(creature) end

function onCreatureDisappear(id)                                npcHandler:onCreatureDisappear(id) end

function onCreatureTurn(creature)                                npcHandler:onCreatureTurn(creature) end

function onCreatureSay(cid, type, msg)                        npcHandler:onCreatureSay(cid, type, msg) end

function onCreatureChangeOutfit(creature)                        npcHandler:onCreatureChangeOutfit(creature) end

function onThink()                                            npcHandler:onThink() end

-- OTServ event handling functions end

 

-- Keyword handling functions start

function tradeItem(cid, message, keywords, parameters)    return npcHandler:defaultTradeHandler(cid, message, keywords, parameters) end

function confirmAction(cid, message, keywords, parameters) return npcHandler:defaultConfirmHandler(cid, message, keywords, parameters) end

function sayMessage(cid, message, keywords, parameters)    return npcHandler:defaultMessageHandler(cid, message, keywords, parameters) end

function greet(cid, message, keywords, parameters)        return npcHandler:defaultGreetHandler(cid, message, keywords, parameters) end

function farewell(cid, message, keywords, parameters)        return npcHandler:defaultFarewellHandler(cid, message, keywords, parameters) end

-- Keyword handling functions end

 

-- Buy item keywords

keywordHandler:addKeyword({'heavy magic missile'},    tradeItem, {itemid = 2311, cost = 125, charges = 10, realname = "heavy magic missile rune"})

keywordHandler:addKeyword({'ultimate healing'},    tradeItem, {itemid = 2273, cost = 175, charges = 2, realname = "ultimate healing rune"})

keywordHandler:addKeyword({'sudden death'},    tradeItem, {itemid = 2268, cost = 325, charges = 2, realname = "sudden death rune"})

keywordHandler:addKeyword({'great fireball'},    tradeItem, {itemid = 2304, cost = 180, charges = 4, realname = "great fireball rune"})

keywordHandler:addKeyword({'explosion'},    tradeItem, {itemid = 2313, cost = 250, charges = 6, realname = "explosion rune"})

keywordHandler:addKeyword({'light wand'},    tradeItem, {itemid = 2163, cost = 500, realname = "magic light wand"})

keywordHandler:addKeyword({'lightwand'},    tradeItem, {itemid = 2163, cost = 500, realname = "magic light wand"})

keywordHandler:addKeyword({'mana fluid'},    tradeItem, {itemid = 2006, cost = 100, charges = 7})

keywordHandler:addKeyword({'manafluid'},    tradeItem, {itemid = 2006, cost = 100, charges = 7})

keywordHandler:addKeyword({'life fluid'},    tradeItem, {itemid = 2006, cost = 80, charges = 10})

keywordHandler:addKeyword({'lifefluid'},    tradeItem, {itemid = 2006, cost = 80, charges = 10})

keywordHandler:addKeyword({'life fluid'},    tradeItem, {itemid = 2006, cost = 80, charges = 10})

keywordHandler:addKeyword({'lifefluid'},    tradeItem, {itemid = 2006, cost = 80, charges = 10})

keywordHandler:addKeyword({'blank'},    tradeItem, {itemid = 2260, cost = 10, realname = "blank rune"})

 

keywordHandler:addKeyword({'xpl'},    tradeItem, {itemid = 2313, cost = 250, charges = 6, realname = "explosion rune"})

keywordHandler:addKeyword({'explo'},    tradeItem, {itemid = 2313, cost = 250, charges = 6, realname = "explosion rune"})

keywordHandler:addKeyword({'gfb'},    tradeItem, {itemid = 2304, cost = 180, charges = 4, realname = "great fireball rune"})

keywordHandler:addKeyword({'sd'},    tradeItem, {itemid = 2268, cost = 325, charges = 2, realname = "sudden death rune"})

keywordHandler:addKeyword({'uh'},    tradeItem, {itemid = 2273, cost = 175, charges = 2, realname = "ultimate healing rune"})

keywordHandler:addKeyword({'hmm'},    tradeItem, {itemid = 2311, cost = 125, charges = 10, realname = "heavy magic missile rune"})

keywordHandler:addKeyword({'rune'},    tradeItem, {itemid = 2260, cost = 20, realname = "blank rune"})

 

 

 

-- Confirm sell/buy keywords

keywordHandler:addKeyword({'yes'}, confirmAction)

keywordHandler:addKeyword({'no'}, confirmAction)

 

-- General message keywords

keywordHandler:addKeyword({'offer'},    sayMessage, {text = 'I offer several kinds of magical runes and other magical items.'})

keywordHandler:addKeyword({'sell'},    sayMessage, {text = 'Why would I need that rubbish?'})

keywordHandler:addKeyword({'job'},    sayMessage, {text = 'I am the shopkeeper of this magic shop.'})

keywordHandler:addKeyword({'quest'},    sayMessage, {text = 'A quest is nothing I want to be involved in.'})

keywordHandler:addKeyword({'mission'},sayMessage, {text = 'I cannot help you in that area, son.'})

keywordHandler:addKeyword({'buy'},        sayMessage, {text = 'I cannot sell that.'})

 

 

keywordHandler:addKeyword({'hi'}, greet, nil)

keywordHandler:addKeyword({'hello'}, greet, nil)

keywordHandler:addKeyword({'hey'}, greet, nil)

keywordHandler:addKeyword({'bye'}, farewell, nil)

keywordHandler:addKeyword({'farewell'}, farewell, nil)

 

Oracle npc:

local internalCustomerQueue = {}

local keywordHandler = KeywordHandler:new({root = {}})

local npcHandler = ShopNpcHandler:new({})

local customerQueue = CustomerQueue:new({customers = internalCustomerQueue, handler = npcHandler})

npcHandler:init(customerQueue, keywordHandler)

npcHandler.walkDistance = 0

local voc = 0

 

-- OTServ event handling functions start

function onThingMove(creature, thing, oldpos, oldstackpos)    npcHandler:onThingMove(creature, thing, oldpos, oldstackpos) end

function onCreatureAppear(creature)                            npcHandler:onCreatureAppear(creature) end

function onCreatureDisappear(id)                                npcHandler:onCreatureDisappear(id) end

function onCreatureTurn(creature)                                npcHandler:onCreatureTurn(creature) end

function onCreatureSay(cid, type, msg)                        npcHandler:onCreatureSay(cid, type, msg) end

function onCreatureChangeOutfit(creature)                        npcHandler:onCreatureChangeOutfit(creature) end

function onThink()                                            npcHandler:onThink() end

-- OTServ event handling functions end

 

-- Keyword handling functions start

function sayMessage(cid, message, keywords, parameters)    return npcHandler:defaultMessageHandler(cid, message, keywords, parameters) end

 

function greet(cid, message, keywords, parameters)

    -- We do not want to use the default "Welcome to my shop" thingie for this npc, so we'll just make this ourselves!

    if npcHandler.focus == cid then

        selfSay('I am already talking to you.')

        npcHandler.talkStart = os.clock()

    elseif npcHandler.focus > 0 or not(npcHandler.queue:isEmpty()) then

        selfSay('Please, ' .. creatureGetName(cid) .. '. Wait for your turn!.')

        if(not npcHandler.queue:isInQueue(cid)) then

            npcHandler.queue:pushBack(cid)

        end

    elseif(npcHandler.focus == 0) and (npcHandler.queue:isEmpty()) then

        selfSay(creatureGetName(cid) .. '! Are you prepared you face your destiny?')

        npcHandler.focus = cid

        voc = 0

        npcHandler.talkStart = os.clock()

    end

   

    return true

end

 

function farewell(cid, message, keywords, parameters)        return npcHandler:defaultFarewellHandler(cid, message, keywords, parameters) end

-- Keyword handling functions end

 

 

function confirmAction(cid, message, keywords, parameters)

    if(cid ~= npcHandler.focus) then

        return false

    end

   

    if(keywords[1] == 'yes') then

       

        if(getPlayerLevel(cid) < 8) then

            selfSay('You are not yet worthy. Come back when you are ready!')

            npcHandler:resetNpc()

            voc = 0

            return true

        end

       

        if(voc == 0) then

            selfSay('Allright then. What vocation do you wish to become? A sorcerer, druid, paladin or knight?')

        else

            doPlayerSetVocation(npcHandler.focus,voc)

            local pos = { x=939, y=263, z=7 }

            doPlayerSetMasterPos(npcHandler.focus,pos)

            doTeleportThing(npcHandler.focus,pos)

            voc = 0

        end

       

    elseif(keywords[1] == 'no') then

       

        if(voc == 0) then

            selfSay('Then come back when you are ready!')

            npcHandler.focus = 0

              voc = 0

              if not(queue[1] == nil) then

                  greetNextCostumer(queue)

              end

        else

            selfSay('Allright then. What vocation do you wish to become? A sorcerer, druid, paladin or knight?')

            voc = 0

        end

       

    end

   

    return true

end

 

function selectVocation(cid, message, keywords, parameters)

    if(cid ~= npcHandler.focus) then

        return false

    end

   

    selfSay('Are you sure that you wish to become a ' .. keywords[1] .. '? This decition is irreversible!')

    voc = parameters.voc

   

    return true

   

end

 

 

keywordHandler:addKeyword({'sorcerer'}, selectVocation, {voc = 1})

keywordHandler:addKeyword({'druid'}, selectVocation, {voc = 2})

keywordHandler:addKeyword({'paladin'}, selectVocation, {voc = 3})

keywordHandler:addKeyword({'knight'}, selectVocation, {voc = 4})

 

-- Confirm sell/buy keywords

keywordHandler:addKeyword({'yes'}, confirmAction)

keywordHandler:addKeyword({'no'}, confirmAction)

 

keywordHandler:addKeyword({'hi'}, greet, nil)

keywordHandler:addKeyword({'hello'}, greet, nil)

keywordHandler:addKeyword({'hey'}, greet, nil)

keywordHandler:addKeyword({'bye'}, farewell, nil)

keywordHandler:addKeyword({'farewell'}, farewell, nil)

 

Boat/Travel npc

local internalCustomerQueue = {}

local keywordHandler = KeywordHandler:new({root = {}})

local npcHandler = ShopNpcHandler:new({})

local customerQueue = CustomerQueue:new({customers = internalCustomerQueue, handler = npcHandler})

npcHandler:init(customerQueue, keywordHandler)

npcHandler.walkDistance = 0

local cost = 0

local destination = {}

 

-- OTServ event handling functions start

function onThingMove(creature, thing, oldpos, oldstackpos)  npcHandler:onThingMove(creature, thing, oldpos, oldstackpos) end

function onCreatureAppear(creature)        npcHandler:onCreatureAppear(creature) end

function onCreatureDisappear(id)        npcHandler:onCreatureDisappear(id) end

function onCreatureTurn(creature)        npcHandler:onCreatureTurn(creature) end

function onCreatureSay(cid, type, msg)      npcHandler:onCreatureSay(cid, type, msg) end

function onCreatureChangeOutfit(creature)      npcHandler:onCreatureChangeOutfit(creature) end

function onThink()            npcHandler:onThink() end

-- OTServ event handling functions end

 

-- Keyword handling functions start

function tradeItem(cid, message, keywords, parameters)  return npcHandler:defaultTradeHandler(cid, message, keywords, parameters) end

function confirmAction(cid, message, keywords, parameters) return npcHandler:defaultConfirmHandler(cid, message, keywords, parameters) end

function sayMessage(cid, message, keywords, parameters)  return npcHandler:defaultMessageHandler(cid, message, keywords, parameters) end

function greet(cid, message, keywords, parameters)  return npcHandler:defaultGreetHandler(cid, message, keywords, parameters) end

function farewell(cid, message, keywords, parameters)  return npcHandler:defaultFarewellHandler(cid, message, keywords, parameters) end

-- Keyword handling functions end

 

function travel(cid, message, keywords, parameters)

  if(cid ~= npcHandler.focus) then

      return false

  end

  selfSay('Do you wish to travel to ' .. keywords[1] .. ' for ' .. parameters.cost .. ' gold coins?')

  destination = parameters.pos

  cost = parameters.cost

  npcHandler.talkstate = 1

  return true

end

 

function confirmAction(cid, message, keywords, parameters)

    if(cid ~= npcHandler.focus) then

        return false

    end

   

    if(keywords[1] == 'yes') then

        if(npcHandler.talkstate == 1) then

            if(doPlayerRemoveMoney(cid, cost) == TRUE) then

                doTeleportThing(cid, destination, 0)

                npcHandler.talkstate = 0

            else

                selfSay('You do not have enough money!')

                npcHandler.talkstate = 0

            end

        end

 

    elseif(keywords[1] == 'no') then

        if(npcHandler.talkstate == 1) then

            selfSay('Where do you wish to go then?')

            npcHandler.talkstate = 0

        end

    end

   

    return true

end

 

 

keywordHandler:addKeyword({'woula'},        travel, {cost = 80, pos = {x = 519, y = 765, z = 6} })

keywordHandler:addKeyword({'aiwa'},        travel, {cost = 80, pos = {x = 465, y = 591, z = 6} })

keywordHandler:addKeyword({'tiqanda'},      travel, {cost = 80, pos = {x = 408, y = 333, z = 6} })

keywordHandler:addKeyword({'ice land'},    travel, {cost = 80, pos = {x = 258, y = 305, z = 6} })

keywordHandler:addKeyword({'milvera'},      travel, {cost = 80, pos = {x = 99, y = 163, z = 6} })

keywordHandler:addKeyword({'anharum'},      travel, {cost = 80, pos = {x = 219, y = 559, z = 6} })

keywordHandler:addKeyword({'slums'},        travel, {cost = 80, pos = {x = 35, y = 348, z = 6} })

 

keywordHandler:addKeyword({'yes'}, confirmAction, nil)

keywordHandler:addKeyword({'no'}, confirmAction, nil)

 

-- General message keywords

keywordHandler:addKeyword({'offer'},  sayMessage, {text = 'I tralev inWorld of Might.'})

keywordHandler:addKeyword({'sell'},  sayMessage, {text = 'Why would I need that rubbish?'})

keywordHandler:addKeyword({'job'},  sayMessage, {text = 'Capitan of this Ship!'})

keywordHandler:addKeyword({'quest'},  sayMessage, {text = 'Go Away!'})

keywordHandler:addKeyword({'mission'},  sayMessage, {text = 'Go Away!'})

 

keywordHandler:addKeyword({'hi'}, greet, nil)

keywordHandler:addKeyword({'hello'}, greet, nil)

keywordHandler:addKeyword({'hey'}, greet, nil)

keywordHandler:addKeyword({'bye'}, farewell, nil)

keywordHandler:addKeyword({'farewell'}, farewell, nil)

 

Postal npc

local internalCustomerQueue = {}

local keywordHandler = KeywordHandler:new({root = {}})

local npcHandler = ShopNpcHandler:new({})

local customerQueue = CustomerQueue:new({customers = internalCustomerQueue, handler = npcHandler})

npcHandler:init(customerQueue, keywordHandler)

 

function onThingMove(creature, thing, oldpos, oldstackpos)  npcHandler:onThingMove(creature, thing, oldpos, oldstackpos) end

function onCreatureAppear(creature)        npcHandler:onCreatureAppear(creature) end

function onCreatureDisappear(id)        npcHandler:onCreatureDisappear(id) end

function onCreatureTurn(creature)        npcHandler:onCreatureTurn(creature) end

function onCreatureSay(cid, type, msg)      npcHandler:onCreatureSay(cid, type, msg) end

function onCreatureChangeOutfit(creature)      npcHandler:onCreatureChangeOutfit(creature) end

function onThink()          npcHandler:onThink() end

 

function tradeItem(cid, message, keywords, parameters)          return npcHandler:defaultTradeHandler(cid, message, keywords, parameters) end

function sayMessage(cid, message, keywords, parameters)  return npcHandler:defaultMessageHandler(cid, message, keywords, parameters) end

function greet(cid, message, keywords, parameters)  return npcHandler:defaultGreetHandler(cid, message, keywords, parameters) end

function farewell(cid, message, keywords, parameters)  return npcHandler:defaultFarewellHandler(cid, message, keywords, parameters) end

 

function confirmAction(cid, message, keywords, parameters)

    if npcHandler.focus ~= cid then

        return false

    end

    if(keywords[1] == 'yes') then

        if(npcHandler.talkState == TALKSTATE_SELL_ITEM) then

            npcHandler.talkState = TALKSTATE_NONE

            local ret = doPlayerSellItem(npcHandler.focus, npcHandler.itemid, npcHandler.stackable, npcHandler.count, npcHandler.cost)

            if(ret == LUA_NO_ERROR) then

  selfSay('Thank you.')

            else

                selfSay('You do not have that item.')

            end

        elseif(npcHandler.talkState == TALKSTATE_BUY_ITEM) then

            npcHandler.talkState = TALKSTATE_NONE

            local ret = 0

            if(npcHandler.charges == nil or npcHandler.charges <= 1) then

                ret = doPlayerBuyItem(npcHandler.focus, npcHandler.itemid, npcHandler.stackable, npcHandler.count, npcHandler.cost)

            else

                ret = doPlayerBuyRune(npcHandler.focus, npcHandler.itemid, npcHandler.count, npcHandler.charges, npcHandler.cost)

            end

            if(ret == LUA_NO_ERROR) then

                if(npcHandler.itemid == 2595) then

  ret = doPlayerBuyItem(npcHandler.focus, 2599, false, npcHandler.count, 0)

  if(ret == LUA_NO_ERROR) then

    selfSay('Here you go.')

  end

  else

  selfSay('Here you go.')

  end

            else

                selfSay('You do not have enough money.')

            end

        end

    elseif(keywords[1] == 'no') then

        if(npcHandler.talkState == TALKSTATE_SELL_ITEM) then

            selfSay('I wouldnt sell that either.')

              npcHandler.talkState = TALKSTATE_NONE

          elseif(npcHandler.talkState == TALKSTATE_BUY_ITEM) then

              selfSay('Too expensive you think?')

              npcHandler.talkState = TALKSTATE_NONE

          end

    end

   

    return true

end

 

 

 

keywordHandler:addKeyword({'parcel'},  tradeItem, {itemid = 2595, cost = 15})

keywordHandler:addKeyword({'letter'},  tradeItem, {itemid = 2597, cost = 5})

keywordHandler:addKeyword({'label'},  tradeItem, {itemid = 2599, cost = 2})

 

keywordHandler:addKeyword({'yes'}, confirmAction)

keywordHandler:addKeyword({'no'}, confirmAction)

 

keywordHandler:addKeyword({'offer'},  sayMessage, {text = 'I sell parcels and letters.'})

keywordHandler:addKeyword({'sell'},  sayMessage, {text = 'Why would I need that rubbish?'})

keywordHandler:addKeyword({'job'},  sayMessage, {text = 'I am the official postman of this city!'})

keywordHandler:addKeyword({'quest'},  sayMessage, {text = '...'})

keywordHandler:addKeyword({'mission'},  sayMessage, {text = 'I know nothing about that.'})

keywordHandler:addKeyword({'buy'}, sayMessage, {text = 'I do not sell any of those.'})

keywordHandler:addKeyword({'name'}, sayMessage, {text = 'My name is Deruno.'})

keywordHandler:addKeyword({'news'}, sayMessage, {text = 'News? I don\'t hear so much from this corner.'})

 

keywordHandler:addKeyword({'hi'}, greet, nil)

keywordHandler:addKeyword({'hello'}, greet, nil)

keywordHandler:addKeyword({'hey'}, greet, nil)

keywordHandler:addKeyword({'bye'}, farewell, nil)

keywordHandler:addKeyword({'farewell'}, farewell, nil)

 

 

é isso comentem

 

(nunca estudei nada sobre esse script :p)

 

flws :hi:

Link para o comentário
Compartilhar em outros sites

  • 4 weeks later...
  • 2 months later...
×
×
  • Criar Novo...