Jump to content
Close

Search the Community

Showing results for tags 'NPC'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Community
    • Rules
    • Portal
    • Resources
    • Commerce
    • Clubs
  • OTServers
    • Discussion
    • Support
    • Tutorial
    • Download
    • Code Development
    • Contests and Events
    • Form Team
    • Advertise your Server
  • Tibia and Bots
    • Discussion
  • Others
    • Playground (Off-topic)
    • Other Games
    • Advertising
    • Graphics and Design
    • Development and Programming
  • League of Legends's Geral
  • League of Legends's Suporte
  • Nto New Season's Tópicos
  • Fakes's Fakes
  • Tibia's Geral
  • Tibia's Notícias
  • Tibia's Media
  • Tibia's Life Thread
  • Computação's Geral
  • Computação's Dicas e Tutoriais
  • Computação's Suporte
  • Roleplaying's Roleplaying
  • Academia de Mapping's Quadro da Clopin
  • Academia de Mapping's Dev Area
  • Academia de Mapping's Quadro do Nolis
  • Academia de Mapping's Quadro do Namikaze
  • Styller's Tópicos

Calendars

  • Official Calendar
  • OTServs Calendar
  • Several Calendars

Product Groups

  • Advertisements in Top
  • Advertisements In Signatures
  • Advertisements in Topics
  • Others Advertisements

Categories

  • Sales Section
    • Scripting Sales
    • Codes Sales
    • Mapping Sales
    • Websites Sales
    • Design/Sprites Sales
    • Bots Sales
  • Look Jobs
  • Looking for Freelancers
  • Team Formation

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Localization


My character


Favorite OTServ


Bot preferred


Interests

Found 224 results

  1. Fala pessoal, hoje venho trazer um sisteminha básico que eu fiz pro meu OT e achei bacana e resolvi postar aqui. Ele está baseado no 1.3, porém em breve posso postar para 0.x. Como ele funciona? Ao usar uma poção, você não irá receber o vial ou a flask, e ao invés disso você irá ganhar uma storage. Ao chega no NPC e falar vial ou flasks ele irá te perguntar se você gostaria de receber pelo preço das poções utilizadas. O sistema é baseado na storage 75123. Em actions, ache o arquivo potions.lua Como era: local berserk = Condition(CONDITION_ATTRIBUTES) berserk:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) berserk:setParameter(CONDITION_PARAM_SKILL_MELEE, 5) berserk:setParameter(CONDITION_PARAM_SKILL_SHIELD, -10) berserk:setParameter(CONDITION_PARAM_BUFF_SPELL, true) local mastermind = Condition(CONDITION_ATTRIBUTES) mastermind:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) mastermind:setParameter(CONDITION_PARAM_STAT_MAGICPOINTS, 3) mastermind:setParameter(CONDITION_PARAM_BUFF_SPELL, true) local bullseye = Condition(CONDITION_ATTRIBUTES) bullseye:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) bullseye:setParameter(CONDITION_PARAM_SKILL_DISTANCE, 5) bullseye:setParameter(CONDITION_PARAM_SKILL_SHIELD, -10) bullseye:setParameter(CONDITION_PARAM_BUFF_SPELL, true) local potions = { [6558] = {transform = {7588, 7589}, effect = CONST_ME_DRAWBLOOD}, [7439] = {condition = berserk, vocations = {4, 8}, effect = CONST_ME_MAGIC_RED, description = "Only knights may drink this potion.", text = "You feel stronger."}, [7440] = {condition = mastermind, vocations = {1, 2, 5, 6}, effect = CONST_ME_MAGIC_BLUE, description = "Only sorcerers and druids may drink this potion.", text = "You feel smarter."}, [7443] = {condition = bullseye, vocations = {3, 7}, effect = CONST_ME_MAGIC_GREEN, description = "Only paladins may drink this potion.", text = "You feel more accurate."}, [7588] = {health = {250, 350}, vocations = {3, 4, 7, 8}, level = 50, flask = 7634, description = "Only knights and paladins of level 50 or above may drink this fluid."}, [7589] = {mana = {115, 185}, vocations = {1, 2, 3, 5, 6, 7}, level = 50, flask = 7634, description = "Only sorcerers, druids and paladins of level 50 or above may drink this fluid."}, [7590] = {mana = {150, 250}, vocations = {1, 2, 5, 6}, level = 80, flask = 7635, description = "Only druids and sorcerers of level 80 or above may drink this fluid."}, [7591] = {health = {425, 575}, vocations = {4, 8}, level = 80, flask = 7635, description = "Only knights of level 80 or above may drink this fluid."}, [7618] = {health = {125, 175}, flask = 7636}, [7620] = {mana = {75, 125}, flask = 7636}, [8472] = {health = {250, 350}, mana = {100, 200}, vocations = {3, 7}, level = 80, flask = 7635, description = "Only paladins of level 80 or above may drink this fluid."}, [8473] = {health = {650, 850}, vocations = {4, 8}, level = 130, flask = 7635, description = "Only knights of level 130 or above may drink this fluid."}, [8474] = {antidote = true, flask = 7636}, [8704] = {health = {60, 90}, flask = 7636}, [26029] = {mana = {425, 575}, vocations = {1, 2, 5, 6}, level = 130, flask = 7635, description = "Only druids and sorcerers of level 130 or above may drink this fluid."}, [26030] = {health = {420, 580}, mana = {250, 350}, vocations = {3, 7}, level = 130, flask = 7635, description = "Only paladins of level 130 or above may drink this fluid."}, [26031] = {health = {875, 1125}, vocations = {4, 8}, level = 200, flask = 7635, description = "Only knights of level 200 or above may drink this fluid."} } function onUse(player, item, fromPosition, target, toPosition, isHotkey) if type(target) == "userdata" and not target:isPlayer() then return false end local potion = potions[item:getId()] if potion.level and player:getLevel() < potion.level or potion.vocations and not table.contains(potion.vocations, player:getVocation():getId()) then player:say(potion.description, TALKTYPE_MONSTER_SAY) return true end if potion.condition then player:addCondition(potion.condition) player:say(potion.text, TALKTYPE_MONSTER_SAY) player:getPosition():sendMagicEffect(potion.effect) elseif potion.transform then item:transform(potion.transform[math.random(#potion.transform)]) item:getPosition():sendMagicEffect(potion.effect) return true else if potion.health then doTargetCombatHealth(0, target, COMBAT_HEALING, potion.health[1], potion.health[2]) end if potion.mana then doTargetCombatMana(0, target, potion.mana[1], potion.mana[2]) end if potion.antidote then target:removeCondition(CONDITION_POISON) end player:addItem(potion.flask) target:say("Aaaah...", TALKTYPE_MONSTER_SAY) target:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) end item:remove(1) return true end Como ficou: local berserk = Condition(CONDITION_ATTRIBUTES) berserk:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) berserk:setParameter(CONDITION_PARAM_SKILL_MELEE, 5) berserk:setParameter(CONDITION_PARAM_SKILL_SHIELD, -10) berserk:setParameter(CONDITION_PARAM_BUFF_SPELL, true) local mastermind = Condition(CONDITION_ATTRIBUTES) mastermind:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) mastermind:setParameter(CONDITION_PARAM_STAT_MAGICPOINTS, 3) mastermind:setParameter(CONDITION_PARAM_BUFF_SPELL, true) local bullseye = Condition(CONDITION_ATTRIBUTES) bullseye:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) bullseye:setParameter(CONDITION_PARAM_SKILL_DISTANCE, 5) bullseye:setParameter(CONDITION_PARAM_SKILL_SHIELD, -10) bullseye:setParameter(CONDITION_PARAM_BUFF_SPELL, true) local potions = { [6558] = {transform = {7588, 7589}, effect = CONST_ME_DRAWBLOOD}, [7439] = {condition = berserk, vocations = {4, 8, 12}, effect = CONST_ME_MAGIC_RED, description = "Only knights may drink this potion.", text = "You feel stronger."}, [7440] = {condition = mastermind, vocations = {1, 2, 5, 6, 9, 10}, effect = CONST_ME_MAGIC_BLUE, description = "Only sorcerers and druids may drink this potion.", text = "You feel smarter."}, [7443] = {condition = bullseye, vocations = {3, 7, 11}, effect = CONST_ME_MAGIC_GREEN, description = "Only paladins may drink this potion.", text = "You feel more accurate."}, [7588] = {health = {250, 350}, vocations = {3, 4, 7, 8, 11, 12}, level = 50, flask = 7634, description = "Only knights and paladins of level 50 or above may drink this fluid."}, [7589] = {mana = {115, 185}, vocations = {1, 2, 3, 5, 6, 7, 9, 10, 11}, level = 50, flask = 7634, description = "Only sorcerers, druids and paladins of level 50 or above may drink this fluid."}, [7590] = {mana = {150, 250}, vocations = {1, 2, 5, 6, 9, 10}, level = 80, flask = 7635, description = "Only druids and sorcerers of level 80 or above may drink this fluid."}, [7591] = {health = {425, 575}, vocations = {4, 8, 12}, level = 80, flask = 7635, description = "Only knights of level 80 or above may drink this fluid."}, [7618] = {health = {125, 175}, flask = 7636}, [7620] = {mana = {75, 125}, flask = 7636}, [8472] = {health = {250, 350}, mana = {100, 200}, vocations = {3, 7, 11}, level = 80, flask = 7635, description = "Only paladins of level 80 or above may drink this fluid."}, [8473] = {health = {650, 850}, vocations = {4, 8, 12}, level = 130, flask = 7635, description = "Only knights of level 130 or above may drink this fluid."}, [8474] = {antidote = true, flask = 7636}, [8704] = {health = {60, 90}, flask = 7636}, [26029] = {mana = {425, 575}, vocations = {1, 2, 5, 6, 9, 10}, level = 130, flask = 7635, description = "Only druids and sorcerers of level 130 or above may drink this fluid."}, [26030] = {health = {420, 580}, mana = {250, 350}, vocations = {3, 7, 11}, level = 130, flask = 7635, description = "Only paladins of level 130 or above may drink this fluid."}, [26031] = {health = {875, 1125}, vocations = {4, 8, 12}, level = 200, flask = 7635, description = "Only knights of level 200 or above may drink this fluid."} } function onUse(player, item, fromPosition, target, toPosition, isHotkey) if type(target) == "userdata" and not target:isPlayer() then return false end local potion = potions[item:getId()] if potion.level and player:getLevel() < potion.level or potion.vocations and not table.contains(potion.vocations, player:getVocation():getId()) then player:say(potion.description, TALKTYPE_MONSTER_SAY) return true end if potion.condition then player:addCondition(potion.condition) player:say(potion.text, TALKTYPE_MONSTER_SAY) player:getPosition():sendMagicEffect(potion.effect) elseif potion.transform then item:transform(potion.transform[math.random(#potion.transform)]) item:getPosition():sendMagicEffect(potion.effect) return true else if potion.health then doTargetCombatHealth(0, target, COMBAT_HEALING, potion.health[1], potion.health[2]) end if potion.mana then doTargetCombatMana(0, target, potion.mana[1], potion.mana[2]) end if potion.antidote then target:removeCondition(CONDITION_POISON) end player:setStorageValue(75132, (player:getStorageValue(75132) + 1)) target:say("Aaaah...", TALKTYPE_MONSTER_SAY) target:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) end item:remove(1) return true end Em creaturescripts, ache o arquivo login.lua Após if player:getLastLoginSaved() <= 0 then Adicione player:setStorageValue(75132, 0) -- Vial/Flask System Agora vamos para a parte do NPC. Irei deixar baseado no Eryn, um NPC que é comum. Na pasta npc/scripts, ache o arquivo que relaciona com seu NPC mágico. Estou me baseando nesse script: https://github.com/nekiro/forgottenserver/blob/8.6-downgrade/data/npc/scripts/runes.lua Antes local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end local shopModule = ShopModule:new() npcHandler:addModule(shopModule) shopModule:addBuyableItem({'spellbook'}, 2175, 150, 'spellbook') shopModule:addBuyableItem({'magic lightwand'}, 2163, 400, 'magic lightwand') shopModule:addBuyableItem({'small health'}, 8704, 20, 1, 'small health potion') shopModule:addBuyableItem({'health potion'}, 7618, 45, 1, 'health potion') shopModule:addBuyableItem({'mana potion'}, 7620, 50, 1, 'mana potion') shopModule:addBuyableItem({'strong health'}, 7588, 100, 1, 'strong health potion') shopModule:addBuyableItem({'strong mana'}, 7589, 80, 1, 'strong mana potion') shopModule:addBuyableItem({'great health'}, 7591, 190, 1, 'great health potion') shopModule:addBuyableItem({'great mana'}, 7590, 120, 1, 'great mana potion') shopModule:addBuyableItem({'great spirit'}, 8472, 190, 1, 'great spirit potion') shopModule:addBuyableItem({'ultimate health'}, 8473, 310, 1, 'ultimate health potion') shopModule:addBuyableItem({'antidote potion'}, 8474, 50, 1, 'antidote potion') shopModule:addSellableItem({'normal potion flask', 'normal flask'}, 7636, 5, 'empty small potion flask') shopModule:addSellableItem({'strong potion flask', 'strong flask'}, 7634, 10, 'empty strong potion flask') shopModule:addSellableItem({'great potion flask', 'great flask'}, 7635, 15, 'empty great potion flask') shopModule:addBuyableItem({'instense healing'}, 2265, 95, 1, 'intense healing rune') shopModule:addBuyableItem({'ultimate healing'}, 2273, 175, 1, 'ultimate healing rune') shopModule:addBuyableItem({'magic wall'}, 2293, 350, 3, 'magic wall rune') shopModule:addBuyableItem({'destroy field'}, 2261, 45, 3, 'destroy field rune') shopModule:addBuyableItem({'light magic missile'}, 2287, 40, 10, 'light magic missile rune') shopModule:addBuyableItem({'heavy magic missile'}, 2311, 120, 10, 'heavy magic missile rune') shopModule:addBuyableItem({'great fireball'}, 2304, 180, 4, 'great fireball rune') shopModule:addBuyableItem({'explosion'}, 2313, 250, 6, 'explosion rune') shopModule:addBuyableItem({'sudden death'}, 2268, 350, 3, 'sudden death rune') shopModule:addBuyableItem({'death arrow'}, 2263, 300, 3, 'death arrow rune') shopModule:addBuyableItem({'paralyze'}, 2278, 700, 1, 'paralyze rune') shopModule:addBuyableItem({'animate dead'}, 2316, 375, 1, 'animate dead rune') shopModule:addBuyableItem({'convince creature'}, 2290, 80, 1, 'convince creature rune') shopModule:addBuyableItem({'chameleon'}, 2291, 210, 1, 'chameleon rune') shopModule:addBuyableItem({'desintegrate'}, 2310, 80, 3, 'desintegreate rune') shopModule:addBuyableItemContainer({'bp ap'}, 2002, 8378, 2000, 1, 'backpack of antidote potions') shopModule:addBuyableItemContainer({'bp slhp'}, 2000, 8610, 400, 1, 'backpack of small health potions') shopModule:addBuyableItemContainer({'bp hp'}, 2000, 7618, 900, 1, 'backpack of health potions') shopModule:addBuyableItemContainer({'bp mp'}, 2001, 7620, 1000, 1, 'backpack of mana potions') shopModule:addBuyableItemContainer({'bp shp'}, 2000, 7588, 2000, 1, 'backpack of strong health potions') shopModule:addBuyableItemContainer({'bp smp'}, 2001, 7589, 1600, 1, 'backpack of strong mana potions') shopModule:addBuyableItemContainer({'bp ghp'}, 2000, 7591, 3800, 1, 'backpack of great health potions') shopModule:addBuyableItemContainer({'bp gmp'}, 2001, 7590, 2400, 1, 'backpack of great mana potions') shopModule:addBuyableItemContainer({'bp gsp'}, 1999, 8376, 3800, 1, 'backpack of great spirit potions') shopModule:addBuyableItemContainer({'bp uhp'}, 2000, 8377, 6200, 1, 'backpack of ultimate health potions') shopModule:addBuyableItem({'wand of vortex', 'vortex'}, 2190, 500, 'wand of vortex') shopModule:addBuyableItem({'wand of dragonbreath', 'dragonbreath'}, 2191, 1000, 'wand of dragonbreath') shopModule:addBuyableItem({'wand of decay', 'decay'}, 2188, 5000, 'wand of decay') shopModule:addBuyableItem({'wand of draconia', 'draconia'}, 8921, 7500, 'wand of draconia') shopModule:addBuyableItem({'wand of cosmic energy', 'cosmic energy'}, 2189, 10000, 'wand of cosmic energy') shopModule:addBuyableItem({'wand of inferno', 'inferno'}, 2187, 15000, 'wand of inferno') shopModule:addBuyableItem({'wand of starstorm', 'starstorm'}, 8920, 18000, 'wand of starstorm') shopModule:addBuyableItem({'wand of voodoo', 'voodoo'}, 8922, 22000, 'wand of voodoo') shopModule:addBuyableItem({'snakebite rod', 'snakebite'}, 2182, 500, 'snakebite rod') shopModule:addBuyableItem({'moonlight rod', 'moonlight'}, 2186, 1000, 'moonlight rod') shopModule:addBuyableItem({'necrotic rod', 'necrotic'}, 2185, 5000, 'necrotic rod') shopModule:addBuyableItem({'northwind rod', 'northwind'}, 8911, 7500, 'northwind rod') shopModule:addBuyableItem({'terra rod', 'terra'}, 2181, 10000, 'terra rod') shopModule:addBuyableItem({'hailstorm rod', 'hailstorm'}, 2183, 15000, 'hailstorm rod') shopModule:addBuyableItem({'springsprout rod', 'springsprout'}, 8912, 18000, 'springsprout rod') shopModule:addBuyableItem({'underworld rod', 'underworld'}, 8910, 22000, 'underworld rod') shopModule:addSellableItem({'wand of vortex', 'vortex'}, 2190, 250, 'wand of vortex') shopModule:addSellableItem({'wand of dragonbreath', 'dragonbreath'}, 2191, 500, 'wand of dragonbreath') shopModule:addSellableItem({'wand of decay', 'decay'}, 2188, 2500, 'wand of decay') shopModule:addSellableItem({'wand of draconia', 'draconia'}, 8921, 3750, 'wand of draconia') shopModule:addSellableItem({'wand of cosmic energy', 'cosmic energy'}, 2189, 5000, 'wand of cosmic energy') shopModule:addSellableItem({'wand of inferno', 'inferno'},2187, 7500, 'wand of inferno') shopModule:addSellableItem({'wand of starstorm', 'starstorm'}, 8920, 9000, 'wand of starstorm') shopModule:addSellableItem({'wand of voodoo', 'voodoo'}, 8922, 11000, 'wand of voodoo') shopModule:addSellableItem({'snakebite rod', 'snakebite'}, 2182, 250,'snakebite rod') shopModule:addSellableItem({'moonlight rod', 'moonlight'}, 2186, 500, 'moonlight rod') shopModule:addSellableItem({'necrotic rod', 'necrotic'}, 2185, 2500, 'necrotic rod') shopModule:addSellableItem({'northwind rod', 'northwind'}, 8911, 3750, 'northwind rod') shopModule:addSellableItem({'terra rod', 'terra'}, 2181, 5000, 'terra rod') shopModule:addSellableItem({'hailstorm rod', 'hailstorm'}, 2183, 7500, 'hailstorm rod') shopModule:addSellableItem({'springsprout rod', 'springsprout'}, 8912, 9000, 'springsprout rod') shopModule:addSellableItem({'underworld rod', 'underworld'}, 8910, 11000, 'underworld rod') function creatureSayCallback(cid, type, msg) if not npcHandler:isFocused(cid) then return false end local player = Player(cid) local vocationId = player:getVocation():getId() local items = { [1] = 2190, [2] = 2182, [5] = 2190, [6] = 2182 } if msgcontains(msg, 'first rod') or msgcontains(msg, 'first wand') then if table.contains({1, 2, 5, 6}, vocationId) then if player:getStorageValue(30002) == -1 then selfSay('So you ask me for a {' .. ItemType(items[vocationId]):getName() .. '} to begin your advanture?', cid) npcHandler.topic[cid] = 1 else selfSay('What? I have already gave you one {' .. ItemType(items[vocationId]):getName() .. '}!', cid) end else selfSay('Sorry, you aren\'t a druid either a sorcerer.', cid) end elseif msgcontains(msg, 'yes') then if npcHandler.topic[cid] == 1 then player:addItem(items[vocationId], 1) selfSay('Here you are young adept, take care yourself.', cid) player:setStorageValue(30002, 1) end npcHandler.topic[cid] = 0 elseif msgcontains(msg, 'no') and npcHandler.topic[cid] == 1 then selfSay('Ok then.', cid) npcHandler.topic[cid] = 0 end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) Depois local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end local shopModule = ShopModule:new() npcHandler:addModule(shopModule) shopModule:addBuyableItem({'spellbook'}, 2175, 150, 'spellbook') shopModule:addBuyableItem({'magic lightwand'}, 2163, 400, 'magic lightwand') shopModule:addBuyableItem({'small health'}, 8704, 20, 1, 'small health potion') shopModule:addBuyableItem({'health potion'}, 7618, 45, 1, 'health potion') shopModule:addBuyableItem({'mana potion'}, 7620, 50, 1, 'mana potion') shopModule:addBuyableItem({'strong health'}, 7588, 100, 1, 'strong health potion') shopModule:addBuyableItem({'strong mana'}, 7589, 80, 1, 'strong mana potion') shopModule:addBuyableItem({'great health'}, 7591, 190, 1, 'great health potion') shopModule:addBuyableItem({'great mana'}, 7590, 120, 1, 'great mana potion') shopModule:addBuyableItem({'great spirit'}, 8472, 190, 1, 'great spirit potion') shopModule:addBuyableItem({'ultimate health'}, 8473, 310, 1, 'ultimate health potion') shopModule:addBuyableItem({'antidote potion'}, 8474, 50, 1, 'antidote potion') shopModule:addSellableItem({'normal potion flask', 'normal flask'}, 7636, 5, 'empty small potion flask') shopModule:addSellableItem({'strong potion flask', 'strong flask'}, 7634, 10, 'empty strong potion flask') shopModule:addSellableItem({'great potion flask', 'great flask'}, 7635, 15, 'empty great potion flask') shopModule:addBuyableItem({'instense healing'}, 2265, 95, 1, 'intense healing rune') shopModule:addBuyableItem({'ultimate healing'}, 2273, 175, 1, 'ultimate healing rune') shopModule:addBuyableItem({'magic wall'}, 2293, 350, 3, 'magic wall rune') shopModule:addBuyableItem({'destroy field'}, 2261, 45, 3, 'destroy field rune') shopModule:addBuyableItem({'light magic missile'}, 2287, 40, 10, 'light magic missile rune') shopModule:addBuyableItem({'heavy magic missile'}, 2311, 120, 10, 'heavy magic missile rune') shopModule:addBuyableItem({'great fireball'}, 2304, 180, 4, 'great fireball rune') shopModule:addBuyableItem({'explosion'}, 2313, 250, 6, 'explosion rune') shopModule:addBuyableItem({'sudden death'}, 2268, 350, 3, 'sudden death rune') shopModule:addBuyableItem({'death arrow'}, 2263, 300, 3, 'death arrow rune') shopModule:addBuyableItem({'paralyze'}, 2278, 700, 1, 'paralyze rune') shopModule:addBuyableItem({'animate dead'}, 2316, 375, 1, 'animate dead rune') shopModule:addBuyableItem({'convince creature'}, 2290, 80, 1, 'convince creature rune') shopModule:addBuyableItem({'chameleon'}, 2291, 210, 1, 'chameleon rune') shopModule:addBuyableItem({'desintegrate'}, 2310, 80, 3, 'desintegreate rune') shopModule:addBuyableItemContainer({'bp ap'}, 2002, 8378, 2000, 1, 'backpack of antidote potions') shopModule:addBuyableItemContainer({'bp slhp'}, 2000, 8610, 400, 1, 'backpack of small health potions') shopModule:addBuyableItemContainer({'bp hp'}, 2000, 7618, 900, 1, 'backpack of health potions') shopModule:addBuyableItemContainer({'bp mp'}, 2001, 7620, 1000, 1, 'backpack of mana potions') shopModule:addBuyableItemContainer({'bp shp'}, 2000, 7588, 2000, 1, 'backpack of strong health potions') shopModule:addBuyableItemContainer({'bp smp'}, 2001, 7589, 1600, 1, 'backpack of strong mana potions') shopModule:addBuyableItemContainer({'bp ghp'}, 2000, 7591, 3800, 1, 'backpack of great health potions') shopModule:addBuyableItemContainer({'bp gmp'}, 2001, 7590, 2400, 1, 'backpack of great mana potions') shopModule:addBuyableItemContainer({'bp gsp'}, 1999, 8376, 3800, 1, 'backpack of great spirit potions') shopModule:addBuyableItemContainer({'bp uhp'}, 2000, 8377, 6200, 1, 'backpack of ultimate health potions') shopModule:addBuyableItem({'wand of vortex', 'vortex'}, 2190, 500, 'wand of vortex') shopModule:addBuyableItem({'wand of dragonbreath', 'dragonbreath'}, 2191, 1000, 'wand of dragonbreath') shopModule:addBuyableItem({'wand of decay', 'decay'}, 2188, 5000, 'wand of decay') shopModule:addBuyableItem({'wand of draconia', 'draconia'}, 8921, 7500, 'wand of draconia') shopModule:addBuyableItem({'wand of cosmic energy', 'cosmic energy'}, 2189, 10000, 'wand of cosmic energy') shopModule:addBuyableItem({'wand of inferno', 'inferno'}, 2187, 15000, 'wand of inferno') shopModule:addBuyableItem({'wand of starstorm', 'starstorm'}, 8920, 18000, 'wand of starstorm') shopModule:addBuyableItem({'wand of voodoo', 'voodoo'}, 8922, 22000, 'wand of voodoo') shopModule:addBuyableItem({'snakebite rod', 'snakebite'}, 2182, 500, 'snakebite rod') shopModule:addBuyableItem({'moonlight rod', 'moonlight'}, 2186, 1000, 'moonlight rod') shopModule:addBuyableItem({'necrotic rod', 'necrotic'}, 2185, 5000, 'necrotic rod') shopModule:addBuyableItem({'northwind rod', 'northwind'}, 8911, 7500, 'northwind rod') shopModule:addBuyableItem({'terra rod', 'terra'}, 2181, 10000, 'terra rod') shopModule:addBuyableItem({'hailstorm rod', 'hailstorm'}, 2183, 15000, 'hailstorm rod') shopModule:addBuyableItem({'springsprout rod', 'springsprout'}, 8912, 18000, 'springsprout rod') shopModule:addBuyableItem({'underworld rod', 'underworld'}, 8910, 22000, 'underworld rod') shopModule:addSellableItem({'wand of vortex', 'vortex'}, 2190, 250, 'wand of vortex') shopModule:addSellableItem({'wand of dragonbreath', 'dragonbreath'}, 2191, 500, 'wand of dragonbreath') shopModule:addSellableItem({'wand of decay', 'decay'}, 2188, 2500, 'wand of decay') shopModule:addSellableItem({'wand of draconia', 'draconia'}, 8921, 3750, 'wand of draconia') shopModule:addSellableItem({'wand of cosmic energy', 'cosmic energy'}, 2189, 5000, 'wand of cosmic energy') shopModule:addSellableItem({'wand of inferno', 'inferno'},2187, 7500, 'wand of inferno') shopModule:addSellableItem({'wand of starstorm', 'starstorm'}, 8920, 9000, 'wand of starstorm') shopModule:addSellableItem({'wand of voodoo', 'voodoo'}, 8922, 11000, 'wand of voodoo') shopModule:addSellableItem({'snakebite rod', 'snakebite'}, 2182, 250,'snakebite rod') shopModule:addSellableItem({'moonlight rod', 'moonlight'}, 2186, 500, 'moonlight rod') shopModule:addSellableItem({'necrotic rod', 'necrotic'}, 2185, 2500, 'necrotic rod') shopModule:addSellableItem({'northwind rod', 'northwind'}, 8911, 3750, 'northwind rod') shopModule:addSellableItem({'terra rod', 'terra'}, 2181, 5000, 'terra rod') shopModule:addSellableItem({'hailstorm rod', 'hailstorm'}, 2183, 7500, 'hailstorm rod') shopModule:addSellableItem({'springsprout rod', 'springsprout'}, 8912, 9000, 'springsprout rod') shopModule:addSellableItem({'underworld rod', 'underworld'}, 8910, 11000, 'underworld rod') function creatureSayCallback(cid, type, msg) if not npcHandler:isFocused(cid) then return false end local player = Player(cid) local vocationId = player:getVocation():getId() local items = { [1] = 2190, [2] = 2182, [5] = 2190, [6] = 2182 } local precoVial = (3 * player:getStorageValue(75132)) if (msgcontains(msg, 'vial') or msgcontains(msg, 'flask')) and player:getStorageValue(75132) >= 1 then npcHandler:say('Do you want to sell {' .. player:getStorageValue(75132) .. '} flasks for 3 gps each?', cid) npcHandler.topic[cid] = 3 else npcHandler:say('You have no vials or flasks in our system.', cid) end if (msgcontains(msg, 'yes') and npcHandler.topic[cid] == 3) then npcHandler:say('You received '.. precoVial ..' gold coins.', cid) player:setStorageValue(75132, 0) player:addItem(2148, precoVial) npcHandler.topic[cid] = 0 elseif (msgcontains(msg, 'no') and npcHandler.topic[cid] == 3) then npcHandler.topic[cid] = 0 npcHandler:say('Ok then.', cid) end if msgcontains(msg, 'first rod') or msgcontains(msg, 'first wand') then if table.contains({1, 2, 5, 6}, vocationId) then if player:getStorageValue(30002) == -1 then selfSay('So you ask me for a {' .. ItemType(items[vocationId]):getName() .. '} to begin your advanture?', cid) npcHandler.topic[cid] = 1 else selfSay('What? I have already gave you one {' .. ItemType(items[vocationId]):getName() .. '}!', cid) end else selfSay('Sorry, you aren\'t a druid either a sorcerer.', cid) end elseif msgcontains(msg, 'yes') then if npcHandler.topic[cid] == 1 then player:addItem(items[vocationId], 1) selfSay('Here you are young adept, take care yourself.', cid) player:setStorageValue(30002, 1) end npcHandler.topic[cid] = 0 elseif msgcontains(msg, 'no') and npcHandler.topic[cid] == 1 then selfSay('Ok then.', cid) npcHandler.topic[cid] = 0 end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) Sendo que você altera o preço que você paga por vial/flask na variável precoVial. Pronto, agora só chegar no seu NPC Mágico e falar vial ou flasks. Creio que tenha ficado entendido o tópico, caso dê algum erro, favor postar aqui.
  2. Praticamente todos os npcs do ot tao com esse problema, quando alguem vai comprar ou vender algo da esse erro no distro: [7/7/2014 22:4:59] [shopModule.onBuy] [7/7/2014 22:4:59] Item not found on shopItems list Alguem me ajuda? PS: o ot eh otx
  3. olá, eu gostaria de saber se alguém pode me ajudar com um npc pra resetar a storege dos players pra q eles possam fazer as quests dnv, em troca de um certo item, ou até msm um item q reset a storage q dai faço o npc q troca ele pelo outro item, tentei algumas formas, mas n consigo resetar tds asstoreges ;-; , bem axo q é isso desde já obgd
  4. Sei que colocar a aura system da PxG é muito complicado e demorado, queria uma coisa mais simples e pratica... Queria saber como faço pra trocar os effects das auras que o npc Nick da. No configuration.lua se não me engano são as effects das auras em : Mas quando olho no Object Builder, esses numeros não batem com os effects do Client. Minha dúvida é, queria saber como pegar um dos effects do Object do meu client e colocar como aura no pokemon .
  5. Olá Tibianos do Tibia King. (Vou direto para o script) Vamos lá: Vá até a pasta data/npc copie e cole algum arquivo XML renomeie para stoned.xml e substitua por isto: (OBS esse é o NPC 1, vocações Paladin, Druid e Sorcerer) Em Roxo você pode alterar o looktype dele e o nome (Entre aspas). -- Não é obrigatório alterar isso-- Agora volte para a pasta data/npc e copie e cole outro arquivo XML e renomeie para stonedkina.xml e substitua por isto: (--Mesma coisa do anterior --) Em Roxo você pode alterar o looktype dele e o nome (Entre aspas). -- Não é obrigatório alterar isso-- ----SCRIPT DO NPC DE PALADIN, SORCERER E DRUID---- Vá na pasta data/npc/scripts copie e cole algum arquivo, renomeie para stoned.lua e cole isso dentro: Em Verde é o ID dos itens que o player vai precisar para ganhar a quantidade de skill. Em Azul são os efeitos que vai aparecer embaixo do Player. Se quiser deixe com esses efeitos mesmo :D ---(Os efeitos vão de 1 a 68, caso queira vê-los apenas digite /z 1.. 68 com o GOD) Em Laranja é a quantidade de EXP de skill o Player vai ganhar ao entregar o ITEM. (Eu aconselho não colocar numero exorbitante como 9999999, pode acontecer de o script travar pela quantidade de skill adicionada). Em Vermelho é a quantidade do ITEM que ele vai precisar ter. (Caso for itens como Armors, Legs, Swords, Axes etc... Deixe 1 se for itens agrupáveis como TALONS, SCARAB COINS etc... Você pode colocar de 1 até 100). -----SCRIPT DO NPC DE KNIGHT------ Vá na pasta data/npc/scripts copie e cole algum arquivo, renomeie para stonedkina.lua e cole isso dentro: <-> As Configurações são as mesmas <-> Em Verde é o ID dos itens que o player vai precisar para ganhar a quantidade de skill. Em Azul é o efeito que vai aparecer embaixo do Player. Se quiser deixe com esses efeitos mesmo :D ---(Os efeitos vão de 1 a 68, caso queira vê-los apenas digite /z 1.. 68 com o GOD) Em Laranja é a quantidade de EXP de skill o Player vai ganhar ao entregar o ITEM. (Eu aconselho não colocar numero exorbitante como 9999999, pode acontecer de o script travar pela quantidade de skill adicionada). Em Vermelho é a quantidade do ITEM que ele vai precisar ter. (Caso for itens como Armors, Legs, Swords, Axes etc... Deixe 1 se for itens agrupáveis como TALONS, SCARAB COINS etc... Você pode colocar de 1 até 100). Por fim é só Importar os NPC'S pelo mapa Editor e adicionar! :D Obrigado e Bom uso do script!!!
  6. Estou trazendo 1 script por semana (geralmente na terça-feira) e caso você tenha alguma sugestão, poste aqui ou mande em mensagem privada a ideia, podendo ser o da próxima semana. Olá pessoal, estou trazendo outro script para o TibiaKing, este NPC faz parte de uma série de NPC's que eu posicionei em meu servidor em locais estratégicos, concedendo bônus diferentes para os jogadores. Em seus NPC's, crie um arquivo XML e coloque o seguinte: <?xml version="1.0" encoding="UTF-8"?> <npc name="Luke" script="data/npc/scripts/speedbuff.lua" walkinterval="2000" floorchange="0"> <health now="100" max="100"/> <look type="152" head="95" body="95" legs="29" feet="56" addons="2" corpse="6080"/> <parameters> <parameter key="message_greet" value="Ola, voce gostaria de um bonus?" /> </parameters> </npc> E dentro da pasta de scripts dos seus NPC's crie um arquivo LUA e coloque: local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end local config ={ effectTime = 10, -- tempo em minutos maxLevel = 125, -- level maximo para receber influencer = 2, -- multiplicador da velocidade aumentada timeStorage = 319203 -- storage para o tempo } local function downSpeed(cid, speed) doChangeSpeed(cid, -speed) end function creatureSayCallback(cid, type, msg) if not npcHandler:isFocused(cid) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid if msgcontains(msg, "bonus") then local level = getPlayerLevel(cid) if level < config.maxLevel then if os.time() > getPlayerStorageValue(cid, config.timeStorage) then setPlayerStorageValue(cid, config.timeStorage, config.effectTime * 60 + os.time()) local speed = config.maxLevel - level doChangeSpeed(cid, speed * config.influencer) addEvent(downSpeed, 60 * config.effectTime, cid, speed * config.influencer) selfSay('Voce recebeu um bonus de velocidade.', cid) else local minutesText local secondsText local seconds = math.floor((getPlayerStorageValue(cid, config.timeStorage) - os.time()) % 60) + 1 local minutes = math.floor((getPlayerStorageValue(cid, config.timeStorage) - os.time()) / 60) minutesText = minutes .." minutos e " secondsText = seconds .." segundos." if seconds == 60 then minutes = minutes + 1 end if minutes == 0 then minutesText = "" end if seconds == 0 or seconds == 60 then if minutes > 0 then minutesText = minutes .." minutos." end secondsText = "" end selfSay('Voce ja possui o bonus, ele expira em ' ..minutesText ..secondsText, cid) end else selfSay('O bonus de velocidade so e aplicado para jogadores de level menor de que '..config.maxLevel..".", cid) end end end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) Explicando o código: com essas configurações o NPC irá: - Conceder ao jogador 10 minutos de bônus de velocidade para jogadores level 125 ou menos. - O jogador que receber o bônus terá velocidade igual a um jogador de level 125. - Impedir o jogador de pegar o bônus diversas vezes. - Todas as configurações podem ser alteradas na variável "config" no topo do código. Qualquer dúvida deixe nos comentários e lembre de enviar a sua sugestão
  7. Boa Tarde TibiaKing!!! Bom estou precisando de um script não deve ser muito difícil !! (pra quem sabe !) Quem poder ajudar já agradeço. ++ Rep Seria um Npc Exemplo Player :Hi Npc: Ola (PLAYERNAME) gostaria de receber {buff} ? Player: Buff Npc: Gostaria de receber qual, Buff 1, buff 2, buff 3,..... buff 12. Player: Buff 12 Npc: voce precisar ter recebido o Buff Anterior (Buff 11) para receber o próximo Buff (Buff 12) Player: Buff 1 Npc: você precisa do item xxxx <<< !! Alem do item uma storage certa e o level! Player: Buff 1 "novamente <" Npc: você já recebeu esse buff! Config do npc [buff 01] = life 1000000 (Permanente) mana = 10000000 ( Permanente) Level = 100 <!! ele so pode receber buff 01 no level 100 e assim em diante Storage = 211100 ( caso ele não tenha < vai aparecer o seguinte "você não completou a missão dos buffs" [buff 02] = life 1000000 (Permanente) mana = 10000000 (Permanente) Level = 200 Storage = 211101 o player só poderá receber o próximo buff se ele Receber o primeiro Buff antes (Ex ele so pode ter buff 02 se tiver recebido o buff 01) Espero que de para entender tudo!!
  8. Boa tarde.., nao sei se é a Area correta mudem pf. Queria um NPC que Aluga-se uma Rod por um Tempo.. (8.54)
  9. Olá, o npc promotion, que promove o player de Druid para Elder druid, está promovendo mesmo as free acc, preciso que ele verifique se a conta é free ou premium, e faça a promoção apenas se o player for premium. Segue o código que estou usando: local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end local node1 = keywordHandler:addKeyword({'promot'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'I can promote you for 20000 gold coins. Do you want me to promote you?'}) node1:addChildKeyword({'yes'}, StdModule.promotePlayer, {npcHandler = npcHandler, cost = 20000, level = 20, promotion = 1, text = 'Congratulations! You are now promoted.'}) node1:addChildKeyword({'no'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'Alright then, come back when you are ready.', reset = true}) npcHandler:addModule(FocusModule:new())
  10. Boa tarde, Estou com este seguinte código dando isto attempt to index local 'v' (a boolean value) na linha 1077 -- Advanced NPC System (Created by Jiddo), -- Modified by TheForgottenServer Team, -- Modified by The OTX Server Team. if(Modules == nil) then -- Constants used to separate buying from selling. SHOPMODULE_SELL_ITEM = 1 SHOPMODULE_BUY_ITEM = 2 SHOPMODULE_BUY_ITEM_CONTAINER = 3 -- Constants used for shop mode. Notice: addBuyableItemContainer is working on all modes SHOPMODULE_MODE_TALK = 1 -- Old system used before Tibia 8.2: sell/buy item name SHOPMODULE_MODE_TRADE = 2 -- Trade window system introduced in Tibia 8.2 SHOPMODULE_MODE_BOTH = 3 -- Both working at one time -- Used in shop mode SHOPMODULE_MODE = SHOPMODULE_MODE_TALK -- Constants used for outfit giving mode OUTFITMODULE_FUNCTION_OLD = { doPlayerAddOutfit, canPlayerWearOutfit } -- lookType usage OUTFITMODULE_FUNCTION_NEW = { doPlayerAddOutfitId, canPlayerWearOutfitId } -- OutfitId usage -- Used in outfit module OUTFITMODULE_FUNCTION = OUTFITMODULE_FUNCTION_NEW if(OUTFITMODULE_FUNCTION[1] == nil or OUTFITMODULE_FUNCTION[2] == nil) then OUTFITMODULE_FUNCTION = OUTFITMODULE_FUNCTION_OLD end Modules = { parseableModules = {} } StdModule = {} -- These callback function must be called with parameters.npcHandler = npcHandler in the parameters table or they will not work correctly. -- Notice: The members of StdModule have not yet been tested. If you find any bugs, please report them to me. -- Usage: -- keywordHandler:addKeyword({'offer'}, StdModule.say, {npcHandler = npcHandler, text = 'I sell many powerful melee weapons.'}) function StdModule.say(cid, message, keywords, parameters, node) local npcHandler = parameters.npcHandler if(npcHandler == nil) then print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'StdModule.say - Call without any npcHandler instance.') return false end local onlyFocus = (parameters.onlyFocus == nil or parameters.onlyFocus == true) if(not npcHandler:isFocused(cid) and onlyFocus) then return false end local parseInfo = {[TAG_PLAYERNAME] = getCreatureName(cid)} npcHandler:say(npcHandler:parseMessage(parameters.text or parameters.message, parseInfo), cid, parameters.publicize and true) if(parameters.reset) then npcHandler:resetNpc(cid) elseif(parameters.moveup and type(parameters.moveup) == 'number') then npcHandler.keywordHandler:moveUp(parameters.moveup) end return true end --Usage: -- local node1 = keywordHandler:addKeyword({'promot'}, StdModule.say, {npcHandler = npcHandler, text = 'I can promote you for 20000 brozne coins. Do you want me to promote you?'}) -- node1:addChildKeyword({'yes'}, StdModule.promotePlayer, {npcHandler = npcHandler, cost = 20000, promotion = 1, level = 20}, text = 'Congratulations! You are now promoted.') -- node1:addChildKeyword({'no'}, StdModule.say, {npcHandler = npcHandler, text = 'Alright then, come back when you are ready.'}, reset = true) function StdModule.promotePlayer(cid, message, keywords, parameters, node) local npcHandler = parameters.npcHandler if(npcHandler == nil) then print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'StdModule.promotePlayer - Call without any npcHandler instance.') return false end if(not npcHandler:isFocused(cid)) then return false end if(isPremium(cid) or not getBooleanFromString(getConfigValue('premiumForPromotion'))) then if(getPlayerPromotionLevel(cid) >= parameters.promotion) then npcHandler:say('You are already promoted!', cid) elseif(getPlayerLevel(cid) < parameters.level) then npcHandler:say('I am sorry, but I can only promote you once you have reached level ' .. parameters.level .. '.', cid) elseif(not doPlayerRemoveMoney(cid, parameters.cost)) then npcHandler:say('You do not have enough money!', cid) else doPlayerSetPromotionLevel(cid, parameters.promotion) npcHandler:say(parameters.text, cid) end else npcHandler:say("You need a premium account in order to get promoted.", cid) end npcHandler:resetNpc(cid) return true end function StdModule.learnSpell(cid, message, keywords, parameters, node) local npcHandler = parameters.npcHandler if(npcHandler == nil) then print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'StdModule.learnSpell - Call without any npcHandler instance.') return false end if(not npcHandler:isFocused(cid)) then return false end if(isPremium(cid) or not(parameters.premium)) then if(getPlayerLearnedInstantSpell(cid, parameters.spellName)) then npcHandler:say('You already know this spell.', cid) elseif(getPlayerLevel(cid) < parameters.level) then npcHandler:say('You need to obtain a level of ' .. parameters.level .. ' or higher to be able to learn ' .. parameters.spellName .. '.', cid) elseif(not parameters.vocation(cid)) then npcHandler:say('This spell is not for your vocation', cid) elseif(not doPlayerRemoveMoney(cid, parameters.price)) then npcHandler:say('You do not have enough money, this spell costs ' .. parameters.price .. ' gold coins.', cid) else npcHandler:say('You have learned ' .. parameters.spellName .. '.', cid) playerLearnInstantSpell(cid, parameters.spellName) end else npcHandler:say('You need a premium account in order to buy ' .. parameters.spellName .. '.', cid) end npcHandler:resetNpc(cid) return true end function StdModule.bless(cid, message, keywords, parameters, node) local npcHandler = parameters.npcHandler if(npcHandler == nil) then print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'StdModule.bless - Call without any npcHandler instance.') return false end if(not getBooleanFromString(getConfigValue('blessings'))) then npcHandler:say("Sorry, but Gods moved back my permission to bless anyone.", cid) return false end if(not npcHandler:isFocused(cid)) then return false end if(isPremium(cid) or not getBooleanFromString(getConfigValue('blessingsOnlyPremium')) or not parameters.premium) then local price = parameters.baseCost if(getPlayerLevel(cid) > parameters.startLevel) then price = (price + ((math.min(parameters.endLevel, getPlayerLevel(cid)) - parameters.startLevel) * parameters.levelCost)) end if(parameters.number > 0) then if(getPlayerBlessing(cid, parameters.number)) then npcHandler:say("Gods have already blessed you with this blessing!", cid) elseif(not doPlayerRemoveMoney(cid, price)) then npcHandler:say("You don't have enough money for blessing.", cid) else npcHandler:say("You have been blessed by one of the five gods!", cid) doPlayerAddBlessing(cid, parameters.number) end else if(getPlayerPVPBlessing(cid)) then npcHandler:say("Gods have already blessed you with this blessing!", cid) elseif(not doPlayerRemoveMoney(cid, price)) then npcHandler:say("You don't have enough money for blessing.", cid) else local any = false for i = 1, 5 do if(getPlayerBlessing(cid, i)) then any = true break end end if(any) then npcHandler:say("You have been blessed by the god of war!", cid) doPlayerSetPVPBlessing(cid) else npcHandler:say("You need to be blessed by at least one god to get this blessing.", cid) end end end else npcHandler:say('You need a premium account in order to be blessed.', cid) end npcHandler:resetNpc(cid) return true end function StdModule.travel(cid, message, keywords, parameters, node) local npcHandler = parameters.npcHandler if(npcHandler == nil) then print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'StdModule.travel - Call without any npcHandler instance.') return false end if(not npcHandler:isFocused(cid)) then return false end local storage, pzLocked = parameters.storageValue or (EMPTY_STORAGE + 1), parameters.allowLocked or false if(parameters.premium and not isPremium(cid)) then npcHandler:say('I\'m sorry, but you need a premium account in order to travel onboard our ships.', cid) elseif(parameters.level ~= nil and getPlayerLevel(cid) < parameters.level) then npcHandler:say('You must reach level ' .. parameters.level .. ' before I can let you go there.', cid) elseif(parameters.storageId ~= nil and getPlayerStorageValue(cid, parameters.storageId) < storage) then npcHandler:say(parameters.storageInfo or 'You may not travel there yet!', cid) elseif(not pzLocked and isPlayerPzLocked(cid)) then npcHandler:say('First get rid of those blood stains! You are not going to ruin my vehicle!', cid) elseif(not doPlayerRemoveMoney(cid, parameters.cost)) then npcHandler:say('You don\'t have enough money.', cid) else npcHandler:say('Set the sails!', cid) npcHandler:releaseFocus(cid) doTeleportThing(cid, parameters.destination, false) doSendMagicEffect(parameters.destination, CONST_ME_TELEPORT) end npcHandler:resetNpc(cid) return true end FocusModule = { npcHandler = nil } -- Creates a new instance of FocusModule without an associated NpcHandler. function FocusModule:new() local obj = {} setmetatable(obj, self) self.__index = self return obj end -- Inits the module and associates handler to it. function FocusModule:init(handler) self.npcHandler = handler for i, word in pairs(FOCUS_GREETWORDS) do local obj = {} table.insert(obj, word) obj.callback = FOCUS_GREETWORDS.callback or FocusModule.messageMatcher handler.keywordHandler:addKeyword(obj, FocusModule.onGreet, {module = self}) end for i, word in pairs(FOCUS_FAREWELLWORDS) do local obj = {} table.insert(obj, word) obj.callback = FOCUS_FAREWELLWORDS.callback or FocusModule.messageMatcher handler.keywordHandler:addKeyword(obj, FocusModule.onFarewell, {module = self}) end end -- Greeting callback function. function FocusModule.onGreet(cid, message, keywords, parameters) parameters.module.npcHandler:onGreet(cid) return true end -- UnGreeting callback function. function FocusModule.onFarewell(cid, message, keywords, parameters) if(not parameters.module.npcHandler:isFocused(cid)) then return false end parameters.module.npcHandler:onFarewell(cid) parameters.module.npcHandler:resetNpc(cid) return true end -- Custom message matching callback function for greeting messages. function FocusModule.messageMatcher(keywords, message) local spectators = getSpectators(getCreaturePosition(getNpcId()), 7, 7) for i, word in pairs(keywords) do if(type(word) == 'string') then if(string.find(message, word) and not string.find(message, '[%w+]' .. word) and not string.find(message, word .. '[%w+]')) then if(string.find(message, getCreatureName(getNpcId()))) then return true end for i, uid in ipairs(spectators) do if(string.find(message, getCreatureName(uid))) then return false end end return true end end end return false end KeywordModule = { npcHandler = nil } -- Add it to the parseable module list. Modules.parseableModules['module_keywords'] = KeywordModule function KeywordModule:new() local obj = {} setmetatable(obj, self) self.__index = self return obj end function KeywordModule:init(handler) self.npcHandler = handler end -- Parses all known parameters. function KeywordModule:parseParameters() local ret = NpcSystem.getParameter('keywords') if(ret ~= nil) then self:parseKeywords(ret) end end function KeywordModule:parseKeywords(data) local n = 1 for keys in string.gmatch(data, '[^;]+') do local i = 1 local keywords = {} for temp in string.gmatch(keys, '[^,]+') do table.insert(keywords, temp) i = i + 1 end if(i ~= 1) then local reply = NpcSystem.getParameter('keyword_reply' .. n) if(reply ~= nil) then self:addKeyword(keywords, reply) else print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'Parameter \'' .. 'keyword_reply' .. n .. '\' missing. Skipping...') end else print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'No keywords found for keyword set #' .. n .. '. Skipping...') end n = n + 1 end end function KeywordModule:addKeyword(keywords, reply) self.npcHandler.keywordHandler:addKeyword(keywords, StdModule.say, {npcHandler = self.npcHandler, onlyFocus = true, text = reply, reset = true}) end TravelModule = { npcHandler = nil, destinations = nil, yesNode = nil, noNode = nil, } -- Add it to the parseable module list. Modules.parseableModules['module_travel'] = TravelModule function TravelModule:new() local obj = {} setmetatable(obj, self) self.__index = self return obj end function TravelModule:init(handler) self.npcHandler = handler self.yesNode = KeywordNode:new(SHOP_YESWORD, TravelModule.onConfirm, {module = self}) self.noNode = KeywordNode:new(SHOP_NOWORD, TravelModule.onDecline, {module = self}) self.destinations = {} end -- Parses all known parameters. function TravelModule:parseParameters() local ret = NpcSystem.getParameter('travel_destinations') if(ret ~= nil) then self:parseDestinations(ret) for _, word in ipairs({'destination', 'list', 'where', 'travel'}) do self.npcHandler.keywordHandler:addKeyword({word}, TravelModule.listDestinations, {module = self}) end end end function TravelModule:parseDestinations(data) for destination in string.gmatch(data, '[^;]+') do local i, name, pos, cost, premium, level, storage = 1, nil, {x = nil, y = nil, z = nil}, nil, false for tmp in string.gmatch(destination, '[^,]+') do if(i == 1) then name = tmp elseif(i == 2) then pos.x = tonumber(tmp) elseif(i == 3) then pos.y = tonumber(tmp) elseif(i == 4) then pos.z = tonumber(tmp) elseif(i == 5) then cost = tonumber(tmp) elseif(i == 6) then premium = getBooleanFromString(tmp) else print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'Unknown parameter found in travel destination parameter.', tmp, destination) end i = i + 1 end if(name ~= nil and pos.x ~= nil and pos.y ~= nil and pos.z ~= nil and cost ~= nil) then self:addDestination(name, pos, cost, premium) else print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'Parameter(s) missing for travel destination:', name, pos, cost, premium) end end end function TravelModule:addDestination(name, position, price, premium) table.insert(self.destinations, name) local parameters = { cost = price, destination = position, premium = premium, module = self } local keywords, bringWords = {}, {} table.insert(keywords, name) table.insert(bringWords, 'bring me to ' .. name) self.npcHandler.keywordHandler:addKeyword(bringWords, TravelModule.bring, parameters) local node = self.npcHandler.keywordHandler:addKeyword(keywords, TravelModule.travel, parameters) node:addChildKeywordNode(self.yesNode) node:addChildKeywordNode(self.noNode) end function TravelModule.travel(cid, message, keywords, parameters, node) local module = parameters.module if(not module.npcHandler:isFocused(cid)) then return false end module.npcHandler:say('Do you want to travel to ' .. keywords[1] .. ' for ' .. parameters.cost .. ' gold coins?', cid) return true end function TravelModule.onConfirm(cid, message, keywords, parameters, node) local module = parameters.module if(not module.npcHandler:isFocused(cid)) then return false end local parent = node:getParent():getParameters() if(isPremium(cid) or not parent.premium) then if(not isPlayerPzLocked(cid)) then if(doPlayerRemoveMoney(cid, parent.cost)) then module.npcHandler:say('Set the sails!', cid) module.npcHandler:releaseFocus(cid) doTeleportThing(cid, parent.destination, true) doSendMagicEffect(parent.destination, CONST_ME_TELEPORT) else module.npcHandler:say('You don\'t have enough money.', cid) end else module.npcHandler:say('First get rid of those blood stains! You are not going to ruin my vehicle!', cid) end else module.npcHandler:say('I\'m sorry, but you need a premium account in order to travel onboard our ships.', cid) end module.npcHandler:resetNpc(cid) return true end -- onDecline keyword callback function. Generally called when the player sais 'no' after wanting to buy an item. function TravelModule.onDecline(cid, message, keywords, parameters, node) local module = parameters.module if(not module.npcHandler:isFocused(cid)) then return false end module.npcHandler:say(module.npcHandler:parseMessage(module.npcHandler:getMessage(MESSAGE_DECLINE), {[TAG_PLAYERNAME] = getCreatureName(cid)}), cid) module.npcHandler:resetNpc(cid) return true end function TravelModule.bring(cid, message, keywords, parameters, node) local module = parameters.module if(not module.npcHandler:isFocused(cid)) then return false end if((isPremium(cid) or not parameters.premium) and not isPlayerPzLocked(cid) and doPlayerRemoveMoney(cid, parameters.cost)) then module.npcHandler:say('Set the sails!', cid) module.npcHandler:releaseFocus(cid) doTeleportThing(cid, parameters.destination, false) doSendMagicEffect(parameters.destination, CONST_ME_TELEPORT) end module.npcHandler:releaseFocus(cid) return true end function TravelModule.listDestinations(cid, message, keywords, parameters, node) local module = parameters.module if(not module.npcHandler:isFocused(cid)) then return false end local msg = nil for _, destination in ipairs(module.destinations) do if(msg ~= nil) then msg = msg .. ", " else msg = "" end msg = msg .. "{" .. destination .. "}" end module.npcHandler:say(msg .. ".", cid) module.npcHandler:resetNpc(cid) return true end OutfitModule = { npcHandler = nil, outfits = nil, yesNode = nil, noNode = nil, } -- Add it to the parseable module list. Modules.parseableModules['module_outfit'] = OutfitModule function OutfitModule:new() if(OUTFITMODULE_FUNCTION[1] == nil or OUTFITMODULE_FUNCTION[2] == nil) then return nil end local obj = {} setmetatable(obj, self) self.__index = self return obj end function OutfitModule:init(handler) self.npcHandler = handler self.yesNode = KeywordNode:new(SHOP_YESWORD, OutfitModule.onConfirm, {module = self}) self.noNode = KeywordNode:new(SHOP_NOWORD, OutfitModule.onDecline, {module = self}) self.outfits = {} end -- Parses all known parameters. function OutfitModule:parseParameters() local ret = NpcSystem.getParameter('outfits') if(ret ~= nil) then self:parseKeywords(ret) for _, word in ipairs({'outfits', 'addons'}) do self.npcHandler.keywordHandler:addKeyword({word}, OutfitModule.listOutfits, {module = self}) end end end function OutfitModule:parseKeywords(data) local n = 1 for outfit in string.gmatch(data, '[^;]+') do local i, keywords = 1, {} for tmp in string.gmatch(outfit, '[^,]+') do table.insert(keywords, tmp) i = i + 1 end if(i > 0) then local ret = NpcSystem.getParameter('outfit' .. n) if(ret ~= nil) then self:parseList(keywords, ret) else print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'Missing \'outfit' .. n .. '\' parameter, skipping...') end else print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'No keywords found for outfit set #' .. n .. ', skipping...') end n = n + 1 end end function OutfitModule:parseList(keywords, data) local outfit, items = nil, {} for list in string.gmatch(data, '[^;]+') do local a, b, c, d, e = nil, nil, nil, nil, 1 for tmp in string.gmatch(list, '[^,]+') do if(e == 1) then a = tmp elseif(e == 2) then b = tmp elseif(e == 3) then c = tmp elseif(e == 4) then d = tmp else print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'Unknown parameter found in outfit list while parsing ' .. (outfit == nil and 'outfit' or 'item') .. '.', tmp, list) end e = e + 1 end if(outfit == nil) then outfit = {tonumber(a), tonumber(b), getBooleanFromString(c), d} elseif(a ~= nil) then local tmp = tonumber(a) if((tmp ~= nil or tostring(a) == "money") and b ~= nil and c ~= nil) then a = tmp or 20000 tmp = tonumber(d) if(tmp == nil) then tmp = -1 end items[a] = {b, tmp, c} else print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'Missing parameter(s) for outfit items.', b, c, d) end else print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'Missing base parameter for outfit items.', a) end end if(type(outfit) == 'table') then local tmp = true for i = 1, 2 do if(outfit == nil) then tmp = false break end end if(tmp and table.maxn(items) > 0) then self:addOutfit(keywords, outfit, items) else print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'Invalid outfit, addon or empty items pool.', data) end end end function OutfitModule:addOutfit(keywords, outfit, items) table.insert(self.outfits, keywords[1]) local parameters = { outfit = outfit[1], addon = outfit[2], premium = outfit[3], gender = nil, items = items, module = self } if(outfit[4] ~= nil) then local tmp = string.lower(tostring(outfit[5])) if(tmp == 'male' or tmp == '1') then parameters.gender = 1 elseif(tmp == 'female' or tmp == '0') then parameters.gender = 0 end end for i, name in pairs(keywords) do local words = {} table.insert(words, name) local node = self.npcHandler.keywordHandler:addKeyword(words, OutfitModule.obtain, parameters) node:addChildKeywordNode(self.yesNode) node:addChildKeywordNode(self.noNode) end end function OutfitModule.obtain(cid, message, keywords, parameters, node) local module = parameters.module if(not module.npcHandler:isFocused(cid)) then return false end local i, items, size = 0, nil, table.maxn(parameters.items) for k, v in pairs(parameters.items) do if(v[1] ~= "storageset") then i = i + 1 if(items ~= nil) then if(i == size) then items = items .. " and " else items = items .. ", " end else items = "" end if(tonumber(v[1]) ~= nil and tonumber(v[1]) > 1) then items = items .. v[1] .. " " end items = items .. v[3] end end module.npcHandler:say('Do you want ' .. keywords[1] .. ' ' .. (addon == 0 and "outfit" or "addon") .. ' for ' .. items .. '?', cid) return true end function OutfitModule.onConfirm(cid, message, keywords, parameters, node) local module = parameters.module if(not module.npcHandler:isFocused(cid)) then return false end local parent = node:getParent():getParameters() if(isPremium(cid) or not parent.premium) then if(not OUTFITMODULE_FUNCTION[2](cid, parent.outfit, parent.addon)) then if(parent.addon == 0 or OUTFITMODULE_FUNCTION[2](cid, parent.outfit)) then if(parent.gender == nil or parent.gender == getPlayerSex(cid)) then local found = true for k, v in pairs(parent.items) do local tmp = tonumber(v[1]) if(tmp == nil) then if(v[1] == "storagecheck") then if(getCreatureStorage(cid, k) < v[2]) then found = false end elseif(v[1] == "outfitid") then if(not canPlayerWearOutfitId(cid, k, v[2])) then found = false end elseif(v[1] == "outfit") then if(not canPlayerWearOutfit(cid, k, v[2])) then found = false end else found = false end elseif(k == 20000) then if(getPlayerMoney(cid) < tmp) then found = false end elseif(getPlayerItemCount(cid, k, v[2]) < tmp) then found = false end if(not found) then break end end if(found) then for k, v in pairs(parent.items) do if(tonumber(v[1]) ~= nil) then if(k == 20000) then doPlayerRemoveMoney(cid, v[1]) else doPlayerRemoveItem(cid, k, v[1], v[2]) end elseif(v[1] == "storageset") then doCreatureSetStorage(cid, k, v[2]) end end module.npcHandler:say('It was a pleasure to dress you.', cid) OUTFITMODULE_FUNCTION[1](cid, parent.outfit, parent.addon) doPlayerSetStorageValue(cid, parent.storageId, storage) else module.npcHandler:say('You don\'t have these items!', cid) end else module.npcHandler:say('Sorry, this ' .. (parent.addon == 0 and 'outfit' or 'addon') .. ' is not for your gender.', cid) end else module.npcHandler:say('I will not dress you with addon of outfit you cannot wear!', cid) end else module.npcHandler:say('You already have this ' .. (parent.addon == 0 and 'outfit' or 'addon') .. '!', cid) end else module.npcHandler:say('Sorry, I dress only premium players.', cid) end module.npcHandler:resetNpc(cid) return true end -- onDecline keyword callback function. Generally called when the player sais 'no' after wanting to buy an item. function OutfitModule.onDecline(cid, message, keywords, parameters, node) local module = parameters.module if(not module.npcHandler:isFocused(cid)) then return false end module.npcHandler:say(module.npcHandler:parseMessage(module.npcHandler:getMessage(MESSAGE_DECLINE), {[TAG_PLAYERNAME] = getCreatureName(cid)}), cid) module.npcHandler:resetNpc(cid) return true end function OutfitModule.listOutfits(cid, message, keywords, parameters, node) local module = parameters.module if(not module.npcHandler:isFocused(cid)) then return false end local msg, size = nil, table.maxn(module.outfits) if(size > 0) then for i, outfit in ipairs(module.outfits) do if(msg ~= nil) then if(i == size) then msg = msg .. " and " else msg = msg .. ", " end else msg = "I can dress you into " end msg = msg .. "{" .. outfit .. "}" end else msg = "Sorry, I have nothing to offer right now." end module.npcHandler:say(msg .. ".", cid) module.npcHandler:resetNpc(cid) return true end ShopModule = { npcHandler = nil, yesNode = nil, noNode = nil, noText = '', maxCount = 100, amount = 0 } -- Add it to the parseable module list. Modules.parseableModules['module_shop'] = ShopModule -- Creates a new instance of ShopModule function ShopModule:new() local obj = {} setmetatable(obj, self) self.__index = self return obj end -- Parses all known parameters. function ShopModule:parseParameters() local ret = NpcSystem.getParameter('shop_buyable') if(ret ~= nil) then self:parseBuyable(ret) end local ret = NpcSystem.getParameter('shop_sellable') if(ret ~= nil) then self:parseSellable(ret) end local ret = NpcSystem.getParameter('shop_buyable_containers') if(ret ~= nil) then self:parseBuyableContainers(ret) end end -- Parse a string contaning a set of buyable items. function ShopModule:parseBuyable(data) for item in string.gmatch(data, '[^;]+') do local i, name, itemid, cost, subType, realName = 1, nil, nil, nil, nil, nil for tmp in string.gmatch(item, '[^,]+') do if(i == 1) then name = tmp elseif(i == 2) then itemid = tonumber(tmp) elseif(i == 3) then cost = tonumber(tmp) elseif(i == 4) then subType = tonumber(tmp) elseif(i == 5) then realName = tmp else print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'Unknown parameter found in buyable items parameter.', tmp, item) end i = i + 1 end if(SHOPMODULE_MODE == SHOPMODULE_MODE_TRADE) then if(itemid ~= nil and cost ~= nil) then if(isItemFluidContainer(itemid) and subType == nil) then print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'SubType missing for parameter item:', item) else self:addBuyableItem(nil, itemid, cost, subType, realName) end else print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'Parameter(s) missing for item:', itemid, cost) end elseif(name ~= nil and itemid ~= nil and cost ~= nil) then if(isItemFluidContainer(itemid) and subType == nil) then print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'SubType missing for parameter item:', item) else local names = {} table.insert(names, name) self:addBuyableItem(names, itemid, cost, subType, realName) end else print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'Parameter(s) missing for item:', name, itemid, cost) end end end -- Parse a string contaning a set of sellable items. function ShopModule:parseSellable(data) for item in string.gmatch(data, '[^;]+') do local i, name, itemid, cost, realName = 1, nil, nil, nil, nil for temp in string.gmatch(item, '[^,]+') do if(i == 1) then name = temp elseif(i == 2) then itemid = tonumber(temp) elseif(i == 3) then cost = tonumber(temp) elseif(i == 4) then realName = temp else print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'Unknown parameter found in sellable items parameter.', temp, item) end i = i + 1 end if(SHOPMODULE_MODE == SHOPMODULE_MODE_TRADE) then if(itemid ~= nil and cost ~= nil) then self:addSellableItem(nil, itemid, cost, realName) else print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'Parameter(s) missing for item:', itemid, cost) end elseif(name ~= nil and itemid ~= nil and cost ~= nil) then local names = {} table.insert(names, name) self:addSellableItem(names, itemid, cost, realName) else print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'Parameter(s) missing for item:', name, itemid, cost) end end end -- Parse a string contaning a set of buyable items. function ShopModule:parseBuyableContainers(data) for item in string.gmatch(data, '[^;]+') do local i, name, container, itemid, cost, subType, realName = 1, nil, nil, nil, nil, nil, nil for temp in string.gmatch(item, '[^,]+') do if(i == 1) then name = temp elseif(i == 2) then itemid = tonumber(temp) elseif(i == 3) then itemid = tonumber(temp) elseif(i == 4) then cost = tonumber(temp) elseif(i == 5) then subType = tonumber(temp) elseif(i == 6) then realName = temp else print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'Unknown parameter found in buyable items parameter.', temp, item) end i = i + 1 end if(name ~= nil and container ~= nil and itemid ~= nil and cost ~= nil) then if(isItemFluidContainer(itemid) and subType == nil) then print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'SubType missing for parameter item:', item) else local names = {} table.insert(names, name) self:addBuyableItemContainer(names, container, itemid, cost, subType, realName) end else print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'Parameter(s) missing for item:', name, container, itemid, cost) end end end -- Initializes the module and associates handler to it. function ShopModule:init(handler) self.npcHandler = handler self.yesNode = KeywordNode:new(SHOP_YESWORD, ShopModule.onConfirm, {module = self}) self.noNode = KeywordNode:new(SHOP_NOWORD, ShopModule.onDecline, {module = self}) self.noText = handler:getMessage(MESSAGE_DECLINE) if(SHOPMODULE_MODE ~= SHOPMODULE_MODE_TALK) then for i, word in pairs(SHOP_TRADEREQUEST) do local obj = {} table.insert(obj, word) obj.callback = SHOP_TRADEREQUEST.callback or ShopModule.messageMatcher handler.keywordHandler:addKeyword(obj, ShopModule.requestTrade, {module = self}) end end end -- Custom message matching callback function for requesting trade messages. function ShopModule.messageMatcher(keywords, message) for i, word in pairs(keywords) do if(type(word) == 'string' and string.find(message, word) and not string.find(message, '[%w+]' .. word) and not string.find(message, word .. '[%w+]')) then return true end end return false end -- Resets the module-specific variables. function ShopModule:reset() self.amount = 0 end -- Function used to match a number value from a string. function ShopModule:getCount(message) local ret, b, e = 1, string.find(message, PATTERN_COUNT) if(b ~= nil and e ~= nil) then ret = tonumber(string.sub(message, b, e)) end return math.max(1, math.min(self.maxCount, ret)) end -- Adds a new buyable item. -- names = A table containing one or more strings of alternative names to this item. Used only for old buy/sell system. -- itemid = The itemid of the buyable item -- cost = The price of one single item -- subType - The subType of each rune or fluidcontainer item. Can be left out if it is not a rune/fluidcontainer. Default value is 0 and 1 (depending on shop mode) -- realName - The real, full name for the item. Will be used as ITEMNAME in MESSAGE_ONBUY and MESSAGE_ONSELL if defined. Default value is nil (getItemNameById will be used) function ShopModule:addBuyableItem(names, itemid, cost, subType, realName) if(type(subType) == 'string' and realName == nil) then realName = subType subType = nil end local v = getItemInfo(itemid) if(SHOPMODULE_MODE ~= SHOPMODULE_MODE_TALK) then local item = { id = itemid, buy = cost, sell = -1, subType = tonumber(subType) or (v.charges > 0 and v.charges or 0), name = realName or v.name } for i, shopItem in ipairs(self.npcHandler.shopItems) do if(shopItem.id == item.id and (shopItem.subType == item.subType or shopItem.subType == 0)) then if(item.sell ~= shopItem.sell) then item.sell = shopItem.sell end self.npcHandler.shopItems = item item = nil break end end if(item ~= nil) then table.insert(self.npcHandler.shopItems, item) end end if(names ~= nil and SHOPMODULE_MODE ~= SHOPMODULE_MODE_TRADE) then local parameters = { itemid = itemid, cost = cost, eventType = SHOPMODULE_BUY_ITEM, module = self, realName = realName or v.name, subType = tonumber(subType) or (v.charges > 0 and v.charges or 1) } for i, name in pairs(names) do local keywords = {} table.insert(keywords, 'buy') table.insert(keywords, name) local node = self.npcHandler.keywordHandler:addKeyword(keywords, ShopModule.tradeItem, parameters) node:addChildKeywordNode(self.yesNode) node:addChildKeywordNode(self.noNode) end end end -- Adds a new buyable container of items. -- names = A table containing one or more strings of alternative names to this item. -- container = Backpack, bag or any other itemid of container where bought items will be stored -- itemid = The itemid of the buyable item -- cost = The price of one single item -- subType - The subType of each rune or fluidcontainer item. Can be left out if it is not a rune/fluidcontainer. Default value is 1. -- realName - The real, full name for the item. Will be used as ITEMNAME in MESSAGE_ONBUY and MESSAGE_ONSELL if defined. Default value is nil (getItemNameById will be used) function ShopModule:addBuyableItemContainer(names, container, itemid, cost, subType, realName) if(names ~= nil) then local v = getItemInfo(itemid) local parameters = { container = container, itemid = itemid, cost = cost, eventType = SHOPMODULE_BUY_ITEM_CONTAINER, module = self, realName = realName or v.name, subType = tonumber(subType) or (v.charges > 0 and v.charges or 1) } for i, name in pairs(names) do local keywords = {} table.insert(keywords, 'buy') table.insert(keywords, name) local node = self.npcHandler.keywordHandler:addKeyword(keywords, ShopModule.tradeItem, parameters) node:addChildKeywordNode(self.yesNode) node:addChildKeywordNode(self.noNode) end end end -- Adds a new sellable item. -- names = A table containing one or more strings of alternative names to this item. Used only by old buy/sell system. -- itemid = The itemid of the sellable item -- cost = The price of one single item -- realName - The real, full name for the item. Will be used as ITEMNAME in MESSAGE_ONBUY and MESSAGE_ONSELL if defined. Default value is nil (getItemNameById will be used) function ShopModule:addSellableItem(names, itemid, cost, realName) local v = getItemInfo(itemid) if(SHOPMODULE_MODE ~= SHOPMODULE_MODE_TALK) then local item = { id = itemid, buy = -1, sell = cost, subType = ((v.charges > 0 and v.stackable) and v.charges or 0), name = realName or v.name } for i, shopItem in ipairs(self.npcHandler.shopItems) do if(shopItem.id == item.id and shopItem.subType == item.subType) then if(item.buy ~= shopItem.buy) then item.buy = shopItem.buy end self.npcHandler.shopItems = item item = nil break end end if(item ~= nil) then table.insert(self.npcHandler.shopItems, item) end end if(names ~= nil and SHOPMODULE_MODE ~= SHOPMODULE_MODE_TRADE) then local parameters = { itemid = itemid, cost = cost, eventType = SHOPMODULE_SELL_ITEM, module = self, realName = realName or v.name } for i, name in pairs(names) do local keywords = {} table.insert(keywords, 'sell') table.insert(keywords, name) local node = self.npcHandler.keywordHandler:addKeyword(keywords, ShopModule.tradeItem, parameters) node:addChildKeywordNode(self.yesNode) node:addChildKeywordNode(self.noNode) end end end -- onModuleReset callback function. Calls ShopModule:reset() function ShopModule:callbackOnModuleReset() self:reset() return true end -- Callback onBuy() function. If you wish, you can change certain Npc to use your onBuy(). function ShopModule:callbackOnBuy(cid, itemid, subType, amount, ignoreCap, inBackpacks) local shopItem = nil for _, item in ipairs(self.npcHandler.shopItems) do if(item.id == itemid and item.subType == subType) then shopItem = item break end end if(shopItem == nil) then print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'ShopModule.onBuy - Item not found on shopItems list') return false end if(shopItem.buy == -1) then print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'ShopModule.onBuy - Attempt to purchase an item which only sellable') return false end if(amount <= 0) then print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'ShopModule.onBuy - Attempt to purchase ' .. amount .. ' items') return false end local subType, count = shopItem.subType or 0, amount local backpack, backpackPrice, totalCost = 1988, 20, amount * shopItem.buy if(inBackpacks) then totalCost = totalCost + (math.max(1, math.floor(count / getContainerCapById(backpack))) * backpackPrice) end local parseInfo = { [TAG_PLAYERNAME] = getPlayerName(cid), [TAG_ITEMCOUNT] = amount, [TAG_TOTALCOST] = totalCost, [TAG_ITEMNAME] = shopItem.name } if(getPlayerMoney(cid) < totalCost) then local msg = self.npcHandler:getMessage(MESSAGE_NEEDMONEY) doPlayerSendCancel(cid, self.npcHandler:parseMessage(msg, parseInfo)) return false end local a, b = doNpcSellItem(cid, itemid, count, subType, ignoreCap, inBackpacks, backpack) if(a < amount) then local msgId = MESSAGE_NEEDMORESPACE if(a == 0) then msgId = MESSAGE_NEEDSPACE end local msg = self.npcHandler:getMessage(msgId) parseInfo[TAG_ITEMCOUNT] = a doPlayerSendCancel(cid, self.npcHandler:parseMessage(msg, parseInfo)) if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then self.npcHandler.talkStart[cid] = os.time() else self.npcHandler.talkStart = os.time() end if(a > 0) then doPlayerRemoveMoney(cid, ((a * shopItem.buy) + (b * backpackPrice))) return true end return false end local msg = self.npcHandler:getMessage(MESSAGE_BOUGHT) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, self.npcHandler:parseMessage(msg, parseInfo)) doPlayerRemoveMoney(cid, totalCost) if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then self.npcHandler.talkStart[cid] = os.time() else self.npcHandler.talkStart = os.time() end return true end -- Callback onSell() function. If you wish, you can change certain Npc to use your onSell(). function ShopModule:callbackOnSell(cid, itemid, subType, amount, ignoreEquipped, dummy) local shopItem = nil for _, item in ipairs(self.npcHandler.shopItems) do if(item.id == itemid and item.subType == subType) then shopItem = item break end end if(shopItem == nil) then print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'ShopModule.onSell - Item not found on shopItems list') return false end if(shopItem.sell == -1) then print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'ShopModule.onSell - Attempt to sell an item which is only buyable') return false end local parseInfo = { [TAG_PLAYERNAME] = getPlayerName(cid), [TAG_ITEMCOUNT] = amount, [TAG_TOTALCOST] = amount * shopItem.sell, [TAG_ITEMNAME] = shopItem.name } if(subType < 1 or getItemInfo(itemid).stackable) then subType = -1 end if(doPlayerRemoveItem(cid, itemid, amount, subType, ignoreEquipped)) then local msg = self.npcHandler:getMessage(MESSAGE_SOLD) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, self.npcHandler:parseMessage(msg, parseInfo)) doPlayerAddMoney(cid, amount * shopItem.sell) if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then self.npcHandler.talkStart[cid] = os.time() else self.npcHandler.talkStart = os.time() end return true end local msg = self.npcHandler:getMessage(MESSAGE_NEEDITEM) doPlayerSendCancel(cid, self.npcHandler:parseMessage(msg, parseInfo)) if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then self.npcHandler.talkStart[cid] = os.time() else self.npcHandler.talkStart = os.time() end return false end -- Callback for requesting a trade window with the NPC. function ShopModule.requestTrade(cid, message, keywords, parameters, node) local module = parameters.module if(not module.npcHandler:isFocused(cid)) then return false end local shop = getShopOwner(cid) if(shop and shop == getNpcId()) then return true end if(table.maxn(module.npcHandler.shopItems) == 0) then local parseInfo = { [TAG_PLAYERNAME] = getPlayerName(cid) } local msg = module.npcHandler:parseMessage(module.npcHandler:getMessage(MESSAGE_NOSHOP), parseInfo) module.npcHandler:say(msg, cid) return true end local parseInfo = { [TAG_PLAYERNAME] = getPlayerName(cid) } local msg = module.npcHandler:parseMessage(module.npcHandler:getMessage(MESSAGE_SENDTRADE), parseInfo) addEvent(openShopWindow, 100, cid, module.npcHandler.shopItems, function(cid, itemid, subType, amount, ignoreCap, inBackpacks) module.npcHandler:onBuy(cid, itemid, subType, amount, ignoreCap, inBackpacks) end, function(cid, itemid, subType, amount, ignoreCap, inBackpacks) module.npcHandler:onSell(cid, itemid, subType, amount, ignoreCap, inBackpacks) end ) module.npcHandler:say(msg, cid) return true end -- onConfirm keyword callback function. Sells/buys the actual item. function ShopModule.onConfirm(cid, message, keywords, parameters, node) local module = parameters.module if(not module.npcHandler:isFocused(cid)) then return false end local parentParameters = node:getParent():getParameters() local parseInfo = { [TAG_PLAYERNAME] = getPlayerName(cid), [TAG_ITEMCOUNT] = module.amount, [TAG_TOTALCOST] = parentParameters.cost * module.amount, [TAG_ITEMNAME] = parentParameters.realName } if(parentParameters.eventType == SHOPMODULE_SELL_ITEM) then local ret = doPlayerSellItem(cid, parentParameters.itemid, module.amount, parentParameters.cost * module.amount) if(ret) then local msg = module.npcHandler:getMessage(MESSAGE_ONSELL) msg = module.npcHandler:parseMessage(msg, parseInfo) module.npcHandler:say(msg, cid) else local msg = module.npcHandler:getMessage(MESSAGE_MISSINGITEM) msg = module.npcHandler:parseMessage(msg, parseInfo) module.npcHandler:say(msg, cid) end elseif(parentParameters.eventType == SHOPMODULE_BUY_ITEM) then local ret = doPlayerBuyItem(cid, parentParameters.itemid, module.amount, parentParameters.cost * module.amount, parentParameters.subType) if(ret) then if parentParameters.itemid == ITEM_PARCEL then doPlayerBuyItem(cid, ITEM_LABEL, module.amount, 0, parentParameters.subType) end local msg = module.npcHandler:getMessage(MESSAGE_ONBUY) msg = module.npcHandler:parseMessage(msg, parseInfo) module.npcHandler:say(msg, cid) else local msg = module.npcHandler:getMessage(MESSAGE_MISSINGMONEY) msg = module.npcHandler:parseMessage(msg, parseInfo) module.npcHandler:say(msg, cid) end elseif(parentParameters.eventType == SHOPMODULE_BUY_ITEM_CONTAINER) then local ret = doPlayerBuyItemContainer(cid, parentParameters.container, parentParameters.itemid, module.amount, parentParameters.cost * module.amount, parentParameters.subType) if(ret) then local msg = module.npcHandler:getMessage(MESSAGE_ONBUY) msg = module.npcHandler:parseMessage(msg, parseInfo) module.npcHandler:say(msg, cid) else local msg = module.npcHandler:getMessage(MESSAGE_MISSINGMONEY) msg = module.npcHandler:parseMessage(msg, parseInfo) module.npcHandler:say(msg, cid) end end module.npcHandler:resetNpc(cid) return true end -- onDecliune keyword callback function. Generally called when the player sais 'no' after wanting to buy an item. function ShopModule.onDecline(cid, message, keywords, parameters, node) local module = parameters.module if(not module.npcHandler:isFocused(cid)) then return false end local parentParameters = node:getParent():getParameters() local parseInfo = { [TAG_PLAYERNAME] = getPlayerName(cid), [TAG_ITEMCOUNT] = module.amount, [TAG_TOTALCOST] = parentParameters.cost * module.amount, [TAG_ITEMNAME] = parentParameters.realName } local msg = module.npcHandler:parseMessage(module.noText, parseInfo) module.npcHandler:say(msg, cid) module.npcHandler:resetNpc(cid) return true end -- tradeItem callback function. Makes the npc say the message defined by MESSAGE_BUY or MESSAGE_SELL function ShopModule.tradeItem(cid, message, keywords, parameters, node) local module = parameters.module if(not module.npcHandler:isFocused(cid)) then return false end local count = module:getCount(message) module.amount = count local parseInfo = { [TAG_PLAYERNAME] = getPlayerName(cid), [TAG_ITEMCOUNT] = module.amount, [TAG_TOTALCOST] = parameters.cost * module.amount, [TAG_ITEMNAME] = parameters.realName } if(parameters.eventType == SHOPMODULE_SELL_ITEM) then local msg = module.npcHandler:getMessage(MESSAGE_SELL) msg = module.npcHandler:parseMessage(msg, parseInfo) module.npcHandler:say(msg, cid) elseif(parameters.eventType == SHOPMODULE_BUY_ITEM) then local msg = module.npcHandler:getMessage(MESSAGE_BUY) msg = module.npcHandler:parseMessage(msg, parseInfo) module.npcHandler:say(msg, cid) elseif(parameters.eventType == SHOPMODULE_BUY_ITEM_CONTAINER) then local msg = module.npcHandler:getMessage(MESSAGE_BUY) msg = module.npcHandler:parseMessage(msg, parseInfo) module.npcHandler:say(msg, cid) end return true end end
  11. Eai Galera do TK, tranquilo ? Hoje uma pessoa do TibiaKing me procurou pedindo ajuda com Account Manager no TIBIA DBO pelo motivo de não ter dinheiro para hospedar o site, porem no TIBIA DBO pelo que pesquisei ele não tem Account Manager e não dá pra criar por conta de algumas Sources que não tem, e realmente no OT DBO dele dava BUG ao tentar criar por Account Manager (Que eu mesmo criei por conta de não ter). Mas vamos ao que Interessa. Acabei fazendo o NPC Yaman (do começo do jogo) de NPC de escolha de Vocação, e quero disponibilizar pra quem estiver com o mesmo problema e não tenha site. 1º Vai na pasta data/npc/scripts/ e abre a Script do NPC Yaman; 2º Copie o código abaixo e cole lá; 3º Salve, abra o jogo e desfrute. OBS: O player sempre quando morre volta para o mesmo lugar, então coloquei uma validação de que se o Player já estiver com uma vocação ele apenas vai ser teleportado para a city. local focus = 0 local talk_start = 0 local target = 0 local following = false local attacking = false local pos = {x=99, y=188, z=7} function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(cid, pos) if focus == cid then selfSay('Hey!.') focus = 0 talk_start = 0 end end function onCreatureTurn(creature) end function msgcontains(txt, str) return (string.find(txt, str) and not string.find(txt, '(%w+)' .. str) and not string.find(txt, str .. '(%w+)')) end function onCreatureSay(cid, type, msg) if getPlayerVocation(cid) == 0 then msg = string.lower(msg) if (msgcontains(msg, 'hi') and (focus == 0)) and getDistanceToCreature(cid) < 5 then selfSay('Olá, Escolha sua Vocacao: Goku, Vegeta, Piccolo, C17, Gohan, Trunks, Cell, Freeza, Majin Boo, Broly, C18, Uub, Goten, Chibi Trunks, Cooler, Dende, Tsuful, Bardock, Kuririn, Pan, Kaio, Videl, Janemba, Tenshinhan, Jenk, Raditz, C16, Turles, Bulma, Shenron.') talk_start = 1 elseif msgcontains(msg, 'hi') and (focus ~= cid) and getDistanceToCreature(cid) < 5 then selfSay('Sorry, ' .. getCreatureName(cid) .. '! ????????.') elseif focus == cid then talk_start = os.clock() elseif msgcontains(msg, 'bye') and getDistanceToCreature(cid) < 5 then selfSay('Good bye, ' .. getCreatureName(cid) .. '!') focus = 0 talk_start = 0 elseif(msgcontains(msg, 'goku') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar um Goku ?') talk_start = 2 idVocacao = 1 elseif(msgcontains(msg, 'vegeta') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Vegeta ?') talk_start = 2 idVocacao = 17 elseif(msgcontains(msg, 'piccolo') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Piccolo ?') talk_start = 2 idVocacao = 32 elseif(msgcontains(msg, 'c17') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar C17 ?') talk_start = 2 idVocacao = 45 elseif(msgcontains(msg, 'gohan') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Gohan ?') talk_start = 2 idVocacao = 57 elseif(msgcontains(msg, 'trunks') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Trunks ?') talk_start = 2 idVocacao = 71 elseif(msgcontains(msg, 'cell') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Cell ?') talk_start = 2 idVocacao = 83 elseif(msgcontains(msg, 'freeza') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Freeza ?') talk_start = 2 idVocacao = 95 elseif(msgcontains(msg, 'majin boo') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Majin Boo ?') talk_start = 2 idVocacao = 111 elseif(msgcontains(msg, 'broly') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Broly ?') talk_start = 2 idVocacao = 127 elseif(msgcontains(msg, 'c18') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar C18 ?') talk_start = 2 idVocacao = 140 elseif(msgcontains(msg, 'uub') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Uub ?') talk_start = 2 idVocacao = 152 elseif(msgcontains(msg, 'goten') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Goten ?') talk_start = 2 idVocacao = 164 elseif(msgcontains(msg, 'chibi trunks') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Chibi Trunks ?') talk_start = 2 idVocacao = 178 elseif(msgcontains(msg, 'cooler') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Cooler ?') talk_start = 2 idVocacao = 192 elseif(msgcontains(msg, 'dende') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Dende ?') talk_start = 2 idVocacao = 206 elseif(msgcontains(msg, 'tsuful') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Tsuful ?') talk_start = 2 idVocacao = 218 elseif(msgcontains(msg, 'bardock') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Bardock ?') talk_start = 2 idVocacao = 230 elseif(msgcontains(msg, 'kuririn') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Kuririn ?') talk_start = 2 idVocacao = 244 elseif(msgcontains(msg, 'pan') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Pan ?') talk_start = 2 idVocacao = 256 elseif(msgcontains(msg, 'kaio') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Kaio ?') talk_start = 2 idVocacao = 268 elseif(msgcontains(msg, 'videl') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Videl ?') talk_start = 2 idVocacao = 280 elseif(msgcontains(msg, 'janemba') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Janemba ?') talk_start = 2 idVocacao = 292 elseif(msgcontains(msg, 'tenshinhan') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Tenshinhan ?') talk_start = 2 idVocacao = 304 elseif(msgcontains(msg, 'jenk') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Jenk ?') talk_start = 2 idVocacao = 316 elseif(msgcontains(msg, 'raditz') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Raditz ?') talk_start = 2 idVocacao = 328 elseif(msgcontains(msg, 'c16') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar C16 ?') talk_start = 2 idVocacao = 340 elseif(msgcontains(msg, 'turles') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Turles ?') talk_start = 2 idVocacao = 352 elseif(msgcontains(msg, 'bulma') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Bulma ?') talk_start = 2 idVocacao = 364 elseif(msgcontains(msg, 'shenron') and talk_start == 1) then selfSay('Voce Deseja Realmente se tornar Shenron ?') talk_start = 2 idVocacao = 376 elseif(msgcontains(msg, 'yes') and talk_start == 2) then doPlayerSetVocation(cid, idVocacao) doTeleportThing(cid, pos) talk_start = 0 end else doTeleportThing(cid, pos) end end function onThink() doNpcSetCreatureFocus(focus) if (os.clock() - talk_start) > 45 then if focus > 0 then selfSay('Next Please...') end focus = 0 end if focus ~= 0 then if getDistanceToCreature(focus) > 6 then selfSay('Good bye then.') focus = 0 end end end
  12. Dale! suave? deixo aqui um npc que fiz agora para meu servidor... Como fala no titulo, ele cobra uma certa quantia de dinheiro ou item, para dar uma informação, só configure certinho. É bem simples mas pode ajudar alguém Lembrando que está testado e funcionando 100% Vá em data/npc e crie um arquivo XML com o nome info e cole isso dentro... Salve e feche... Agora em data/npc/scripts crie um arquivo LUA com o nome info e cole dentro... Bom, é só isso espero ajudar alguém, se ajudei deixa o REP! Aí pra fortalecer a amizade LEMBRANDO QUE DENTO DO ARQUIVO ESTÁ A EXPLICAÇÃO.
  13. Bom dia galera queria ver o seguinte.. Um npc que teleporta o player para uma sala especial e precisa ser premmy e ter um level minimo para entrar e la dentro o player pode ficar 30 minutos.. depois disso o npc teleporta o player para fora.. e também que ninguém possa entrar enquanto alguém está la dentro. vlw
  14. Sorry I don't speak spanish so you will have to bare with me. This is a new way for people to create npc's which use different types of currency, rather than a coming up with different items to trade with the npc or trying to edit the npc modules this method simplifies everything by providing the npc with a npc currency id. All this npc currency id is, is a storage value.. pretty simple eh? If the npc doesn't have a currency id then it will use the normal currency e.g. gold, plat, cc etc.. I originally posted this on otland, but fuck them xD Using Lailene here you can see she has a currency attribute with id of 123456 <?xml version="1.0" encoding="UTF-8"?> <npc name="Lailene" currency="123456" script="lailene.lua" walkinterval="2000" floorchange="0" speechbubble="2"> <health now="100" max="100"/> <look type="279" head="114" body="94" legs="113" feet="114" addons="0"/> </npc> Now any player who has a storage value of 123456 can purchase things from her shop provided they have enough value stored within the storage, similar to having money in the bank. The money or in this case the storage value is added and removed from the player in real time. Lets get to the code game.cpp Find this bool Game::removeMoney(Cylinder* cylinder, uint64_t money, uint32_t flags /*= 0*/) Replace the whole function with this. bool Game::removeMoney(Cylinder* cylinder, uint64_t money, uint32_t flags /*= 0*/) { if (cylinder == nullptr) { return false; } if (money == 0) { return true; } uint32_t currencyId = 0; Player* player; if (Creature* creature = cylinder->getCreature()) { if (Player* p = creature->getPlayer()) { currencyId = p->getNpcCurrencyId(); player = p; } } if (!currencyId) { std::vector<Container*> containers; std::multimap<uint32_t, Item*> moneyMap; uint64_t moneyCount = 0; for (size_t i = cylinder->getFirstIndex(), j = cylinder->getLastIndex(); i < j; ++i) { Thing* thing = cylinder->getThing(i); if (!thing) { continue; } Item* item = thing->getItem(); if (!item) { continue; } Container* container = item->getContainer(); if (container) { containers.push_back(container); } else { const uint32_t worth = item->getWorth(); if (worth != 0) { moneyCount += worth; moneyMap.emplace(worth, item); } } } size_t i = 0; while (i < containers.size()) { Container* container = containers[i++]; for (Item* item : container->getItemList()) { Container* tmpContainer = item->getContainer(); if (tmpContainer) { containers.push_back(tmpContainer); } else { const uint32_t worth = item->getWorth(); if (worth != 0) { moneyCount += worth; moneyMap.emplace(worth, item); } } } } if (moneyCount < money) { return false; } for (const auto& moneyEntry : moneyMap) { Item* item = moneyEntry.second; if (moneyEntry.first < money) { internalRemoveItem(item); money -= moneyEntry.first; } else if (moneyEntry.first > money) { const uint32_t worth = moneyEntry.first / item->getItemCount(); const uint32_t removeCount = (money / worth) + 1; addMoney(cylinder, (worth * removeCount) - money, flags); internalRemoveItem(item, removeCount); break; } else { internalRemoveItem(item); break; } } } else { int32_t value; player->getStorageValue(currencyId, value); if (value < money) { return false; } player->addStorageValue(currencyId, value - money); } return true; } Next find this void Game::addMoney(Cylinder* cylinder, uint64_t money, uint32_t flags /*= 0*/) Replace the whole function with this void Game::addMoney(Cylinder* cylinder, uint64_t money, uint32_t flags /*= 0*/) { if (money == 0) { return; } if (Creature* creature = cylinder->getCreature()) { if (Player* player = creature->getPlayer()) { if(uint32_t currencyId = player->getNpcCurrencyId()){ int32_t value; player->getStorageValue(currencyId, value); player->addStorageValue(currencyId, value + money); return; } } } uint32_t crystalCoins = money / 10000; money -= crystalCoins * 10000; while (crystalCoins > 0) { const uint16_t count = std::min<uint32_t>(100, crystalCoins); Item* remaindItem = Item::CreateItem(ITEM_CRYSTAL_COIN, count); ReturnValue ret = internalAddItem(cylinder, remaindItem, INDEX_WHEREEVER, flags); if (ret != RETURNVALUE_NOERROR) { internalAddItem(cylinder->getTile(), remaindItem, INDEX_WHEREEVER, FLAG_NOLIMIT); } crystalCoins -= count; } uint16_t platinumCoins = money / 100; if (platinumCoins != 0) { Item* remaindItem = Item::CreateItem(ITEM_PLATINUM_COIN, platinumCoins); ReturnValue ret = internalAddItem(cylinder, remaindItem, INDEX_WHEREEVER, flags); if (ret != RETURNVALUE_NOERROR) { internalAddItem(cylinder->getTile(), remaindItem, INDEX_WHEREEVER, FLAG_NOLIMIT); } money -= platinumCoins * 100; } if (money != 0) { Item* remaindItem = Item::CreateItem(ITEM_GOLD_COIN, money); ReturnValue ret = internalAddItem(cylinder, remaindItem, INDEX_WHEREEVER, flags); if (ret != RETURNVALUE_NOERROR) { internalAddItem(cylinder->getTile(), remaindItem, INDEX_WHEREEVER, FLAG_NOLIMIT); } } } npc.cppLook for this pugi::xml_attribute attr; if ((attr = npcNode.attribute("speed"))) { baseSpeed = pugi::cast<uint32_t>(attr.value()); } else { baseSpeed = 100; } Right underneath that you are going to place this. if ((attr = npcNode.attribute("currency"))) { currency = pugi::cast<uint32_t>(attr.value()); } npc.hLook for this bool isPushable() const final { return walkTicks > 0; } Place this right underneath uint32_t getCurrencyId() const { return currency; } Look for this uint32_t walkTicks; Place this right underneath uint32_t currency; player.cppFind this void Player::openShopWindow(Npc* npc, const std::list<ShopInfo>& shop) Replace that function with this void Player::openShopWindow(Npc* npc, const std::list<ShopInfo>& shop) { shopItemList = shop; sendShop(npc); sendSaleItemList(npc); } Next find this bool Player::updateSaleShopList(const Item* item) Replace that function with this bool Player::updateSaleShopList(const Item* item) { uint16_t itemId = item->getID(); if (itemId != ITEM_GOLD_COIN && itemId != ITEM_PLATINUM_COIN && itemId != ITEM_CRYSTAL_COIN) { auto it = std::find_if(shopItemList.begin(), shopItemList.end(), [itemId](const ShopInfo& shopInfo) { return shopInfo.itemId == itemId && shopInfo.sellPrice != 0; }); if (it == shopItemList.end()) { const Container* container = item->getContainer(); if (!container) { return false; } const auto& items = container->getItemList(); return std::any_of(items.begin(), items.end(), [this](const Item* containerItem) { return updateSaleShopList(containerItem); }); } } if (client) { client->sendSaleItemList(shopOwner, shopItemList); } return true; } Next you are going to look for uint64_t Player::getMoney() const Now right underneath that function you are going to place these. uint64_t Player::getMoney(Npc* npc) const { uint64_t cash; setNpcCurrencyId(npc); uint32_t currencyId = getNpcCurrencyId(); if (currencyId) { int32_t value; getStorageValue(currencyId, value); cash = (uint64_t)value; } else { cash = getMoney(); } return cash; } void Player::setNpcCurrencyId(Npc* npc) const{ currencyId = npc->getCurrencyId(); } uint32_t Player::getNpcCurrencyId() const { return currencyId; } player.hLook for this uint64_t getMoney() const; Place this right underneath uint64_t getMoney(Npc*) const; void setNpcCurrencyId(Npc*) const; uint32_t getNpcCurrencyId() const; Find this void sendShop(Npc* npc) const { if (client) { client->sendShop(npc, shopItemList); } } Place this right underneath void sendSaleItemList(Npc* npc) const { if (client) { client->sendSaleItemList(npc, shopItemList); } } Find this uint32_t manaMax; Place this right underneath mutable uint32_t currencyId; protocolgame.cpp Now find this function void ProtocolGame::sendSaleItemList(const std::list<ShopInfo>& shop) Place this right underneath void ProtocolGame::sendSaleItemList(Npc* npc, const std::list<ShopInfo>& shop) { NetworkMessage msg; msg.addByte(0x7B); msg.add<uint64_t>(player->getMoney(npc)); std::map<uint16_t, uint32_t> saleMap; if (shop.size() <= 5) { // For very small shops it's not worth it to create the complete map for (const ShopInfo& shopInfo : shop) { if (shopInfo.sellPrice == 0) { continue; } int8_t subtype = -1; const ItemType& itemType = Item::items[shopInfo.itemId]; if (itemType.hasSubType() && !itemType.stackable) { subtype = (shopInfo.subType == 0 ? -1 : shopInfo.subType); } uint32_t count = player->getItemTypeCount(shopInfo.itemId, subtype); if (count > 0) { saleMap[shopInfo.itemId] = count; } } } else { // Large shop, it's better to get a cached map of all item counts and use it // We need a temporary map since the finished map should only contain items // available in the shop std::map<uint32_t, uint32_t> tempSaleMap; player->getAllItemTypeCount(tempSaleMap); // We must still check manually for the special items that require subtype matches // (That is, fluids such as potions etc., actually these items are very few since // health potions now use their own ID) for (const ShopInfo& shopInfo : shop) { if (shopInfo.sellPrice == 0) { continue; } int8_t subtype = -1; const ItemType& itemType = Item::items[shopInfo.itemId]; if (itemType.hasSubType() && !itemType.stackable) { subtype = (shopInfo.subType == 0 ? -1 : shopInfo.subType); } if (subtype != -1) { uint32_t count; if (!itemType.isFluidContainer() && !itemType.isSplash()) { count = player->getItemTypeCount(shopInfo.itemId, subtype); // This shop item requires extra checks } else { count = subtype; } if (count > 0) { saleMap[shopInfo.itemId] = count; } } else { std::map<uint32_t, uint32_t>::const_iterator findIt = tempSaleMap.find(shopInfo.itemId); if (findIt != tempSaleMap.end() && findIt->second > 0) { saleMap[shopInfo.itemId] = findIt->second; } } } } uint8_t itemsToSend = std::min<size_t>(saleMap.size(), std::numeric_limits<uint8_t>::max()); msg.addByte(itemsToSend); uint8_t i = 0; for (std::map<uint16_t, uint32_t>::const_iterator it = saleMap.begin(); i < itemsToSend; ++it, ++i) { msg.addItemId(it->first); msg.addByte(std::min<uint32_t>(it->second, std::numeric_limits<uint8_t>::max())); } writeToOutputBuffer(msg); } protocolgame.h Find this void sendSaleItemList(const std::list<ShopInfo>& shop); Place this right underneath void sendSaleItemList(Npc* npc, const std::list<ShopInfo>& shop); luascript.cpp Find int LuaScriptInterface::luaPlayerAddMoney(lua_State* L) Replace that whole function with this int LuaScriptInterface::luaPlayerAddMoney(lua_State* L) { // player:addMoney(money[, currencyId]) uint64_t money = getNumber<uint64_t>(L, 2); uint32_t currencyId = getNumber<uint32_t>(L, 3); Player* player = getUserdata<Player>(L, 1); if (player) { if (currencyId) { int32_t value; player->getStorageValue(currencyId, value); player->addStorageValue(currencyId, value + money); } else { g_game.addMoney(player, money); } pushBoolean(L, true); } else { lua_pushnil(L); } return 1; } Next find this function which should be right below it. int LuaScriptInterface::luaPlayerRemoveMoney(lua_State* L) Replace that whole function with this int LuaScriptInterface::luaPlayerRemoveMoney(lua_State* L) { // player:removeMoney(money[, currencyId]) Player* player = getUserdata<Player>(L, 1); if (player) { uint64_t money = getNumber<uint64_t>(L, 2); uint32_t currencyId = getNumber<uint32_t>(L, 3); if (currencyId) { int32_t value; player->getStorageValue(currencyId, value); if (value < money) { pushBoolean(L, false); return 1; } player->addStorageValue(currencyId, value - money); pushBoolean(L, true); } else { pushBoolean(L, g_game.removeMoney(player, money)); } } else { lua_pushnil(L); } return 1; }
  15. Versão: OTX 0.4 (8.60) Eu tinha um projeto map Global parado e tinha feito todos os npcs de RookGuard. Ficou 100% Falas e quests estão iguais ao Global (basta mudar STORAGE_VALUE). FULL npc rookguard (no bugs).rar Edit* Scan: https://www.virustotal.com/pt/file/2f3d5fd5e7d45df777871e2a1e53ee06ab71aeb4945008600a8fac43b40f2b07/analysis/1536980825/
  16. Boa noite Comunidade. Alguem poderia me ajudar a colocar um verificação para quando o player comprar não poder comprar de novo ? Qual o poblema ? : Quando os player compram a bless eles ainda continuam comprando ela, assim gastando os golds. local focuses = {} local function isFocused(cid) for i, v in pairs(focuses) do if(v == cid) then return true end end return false end local function addFocus(cid) if(not isFocused(cid)) then table.insert(focuses, cid) end end local function removeFocus(cid) for i, v in pairs(focuses) do if(v == cid) then table.remove(focuses, i) break end end end local function lookAtFocus() for i, v in pairs(focuses) do if(isPlayer(v)) then doNpcSetCreatureFocus(v) return end end doNpcSetCreatureFocus(0) end local price = 500000 -- Valor da bless function onCreatureSay(cid, type, msg) if(not (isFocused(cid)) and (msg == "hi" or msg == "hello")) then selfSay("Welcome, ".. getCreatureName(cid) ..". Estou aqui para oferecer protecao extra para seus niveis, diga {protecao}, para ter minha benção.", cid) addFocus(cid) elseif((isFocused(cid)) and (msg == "bless" or msg == "protecao")) then selfSay("Você quer a protecao por {200000 cents}?", cid) elseif((isFocused(cid)) and (msg == "yes")) then if isPremium(cid) then if getPlayerMoney(cid) >= price then selfSay("Agora voce esta {protegido}.", cid) doPlayerRemoveMoney(cid, price) doPlayerAddBlessing(cid, 1) doPlayerAddBlessing(cid, 2) doPlayerAddBlessing(cid, 3) doPlayerAddBlessing(cid, 4) doPlayerAddBlessing(cid, 5) else selfSay("You don't have enough money.", cid) end else selfSay("You need {Premium account}!.", cid) end elseif((isFocused(cid)) and (msg == "bye" or msg == "goodbye" or msg == "cya")) then selfSay("Goodbye!".. getCreatureName(cid) .."", cid) closeShopWindow(cid) removeFocus(cid) end end function onThink() for i, focus in pairs(focuses) do if(not isCreature(focus)) then removeFocus(focus) else local distance = getDistanceTo(focus) or -1 if((distance > 4) or (distance == -1)) then selfSay("Hey, where you going?") removeFocus(focus) end end end lookAtFocus() end
  17. iai pessoal , gostaria de saber se existe como criar um "sistema de lábia" . tipo quanto mas o player vende itens aos npc , com mas valor o mesmo item vai ficando , para ser vendido para o npc . o sistema e parecido com o que existe no rpg brasil . vlw e obrigado.
  18. Olá pessoal do tk, vim trazer hoje uma dll para tibia 8.54 que encontrei em um narutibia pl. Essa Dll pelo que entendi serve pra mudar a cor do nome dos npcs de verde para azul, ela também faz exibir na tela alguma informação e o fps. vejam a dll na imagem ao lado. Para mudar aquele texto exibido pela dll é so editar pelo notepad. download: https://www.mediafire.com/file/dtv314zblnnh845/ntg.dll Scan: https://www.virustotal.com/#/file/c52dc9d0099da27ac788979e055b819b6fafb946ed8b1b04c5ec483a6660036c/detection creditos: Naruto The Greatest
  19. cs007

    NPC NPC Guarda

    Galera, achei esse script perdido em meus scripts de NPCs, ele parece ser interessa e divertido de se por em otserv. Ele ataca players PK e outros monstros mas queria deixar ele mais realista ele fica muito paradão e os players fogem fácil dele. local level = 10 ----- change this to make the npc hit more/less---------------------|damage_min = (level * 2 + maglevel * 3) * min_multiplier | local maglevel = 10 ----- change this to make the npc hit more/less -----------------|damage_max = (level * 2 + maglevel * 3) * max_multiplier | local min_multiplier = 2.1 ----- change this to make the npc hit more/less ----------|damage_formula = math.random(damage_min,damage_max) | local max_multiplier = 4.2 ----- change this to make the npc hit more/less --------------------------------------------------------------------- local check_interval = 5 ----- change this to the time between checks for a creature (the less time the more it will probably lag :S) local radiusx = 7 ----- change this to the amount of squares left/right the NPC checks (default 7 so he checks 7 squares left of him and 7 squares right (the hole screen) local radiusy = 5 ----- change this to the amount of squares left/right the NPC checks (default 5 so he checks 5 squares up of him and 5 squares down (the hole screen) local Attack_message = "An Invader, ATTACK!!!" ----- change this to what the NPC says when he sees a monster(s) local town_name = "Archgard" ----- the name of the town the NPC says when you say "hi" local Attack_monsters = TRUE ----- set to TRUE for the npc to attack monsters in his area or FALSE if he doesnt local Attack_swearers = TRUE ----- set to TRUE for the npc to attack players that swear near him or FALSE if he doesnt local Attack_pkers = TRUE ----- set to TRUE for the npc to attack players with white and red skulls or FALSE if he doesnt local health_left = 10 ----- set to the amount of health the npc will leave a player with if they swear at him (ie at 10 he will hit the player to 10 health left) local swear_message = "Take this!!!" ----- change this to what you want the NPC to say when he attackes a swearer local swear_words = {"shit", "fuck", "dick", "cunt"} ----- if "Attack_swearers" is set to TRUE then the NPC will attack anyone who says a word in here. Remember to put "" around each word and seperate each word with a comma (,) local hit_effect = CONST_ME_MORTAREA ----- set this to the magic effect the creature will be hit with, see global.lua for more effects local shoot_effect = CONST_ANI_SUDDENDEATH ----- set this to the magic effect that will be shot at the creature, see global.lua for more effects local damage_colour = TEXTCOLOR_RED ----- set this to the colour of the text that shows the damage when the creature gets hit ------------------end of config------------------ local check_clock = os.clock() ----- leave this local focus = 0 ----- leave this function msgcontains(txt, str) return (string.find(txt, str) and not string.find(txt, '(%w+)' .. str) and not string.find(txt, str .. '(%w+)')) end function onCreatureSay(cid, type, msg) msg = string.lower(msg) health = getCreatureHealth(cid) - health_left if ((string.find(msg, '(%a*)hi(%a*)'))) and getDistanceToCreature(cid) < 4 then selfSay('Hello ' .. creatureGetName(cid) .. '! I am a defender of '..town_name..'.') doNpcSetCreatureFocus(cid) focus = 0 end if msgcontains(msg, 'time') then selfSay('The time is ' .. getWorldTime() .. '.') end if messageIsInArray(swear_words, msg) then if Attack_swearers == TRUE then selfSay('' .. swear_message ..' ') doCreatureAddHealth(cid,-health) doSendMagicEffect(getThingPos(cid),17) doSendAnimatedText(getThingPos(cid),health,180) doNpcSetCreatureFocus(cid) focus = 0 end end end function getMonstersfromArea(pos, radiusx, radiusy, stack) local monsters = { } local starting = {x = (pos.x - radiusx), y = (pos.y - radiusy), z = pos.z, stackpos = stack} local ending = {x = (pos.x + radiusx), y = (pos.y + radiusy), z = pos.z, stackpos = stack} local checking = {x = starting.x, y = starting.y, z = starting.z, stackpos = starting.stackpos} repeat creature = getThingfromPos(checking) if creature.itemid > 0 then if isCreature(creature.uid) == TRUE then if isPlayer(creature.uid) == FALSE then if Attack_monsters == TRUE then table.insert (monsters, creature.uid) check_clock = os.clock() end elseif isPlayer(creature.uid) == TRUE then if Attack_pkers == TRUE then if getPlayerSkullType(creature.uid) > 0 then table.insert (monsters, creature.uid) check_clock = os.clock() end end end end end if checking.x == pos.x-1 and checking.y == pos.y then checking.x = checking.x+2 else checking.x = checking.x+1 end if checking.x > ending.x then checking.x = starting.x checking.y = checking.y+1 end until checking.y > ending.y return monsters end function onThink() if (Attack_monsters == TRUE and Attack_pkers == TRUE) or (Attack_monsters == TRUE and Attack_pkers == FALSE) or (Attack_monsters == FALSE and Attack_pkers == TRUE) then if (os.clock() - check_clock) > check_interval then monster_table = getMonstersfromArea(getCreaturePosition(getNpcCid( )), radiusx, radiusy, 253) if #monster_table >= 1 then selfSay('' .. Attack_message ..' ') for i = 1, #monster_table do doNpcSetCreatureFocus(monster_table[i]) local damage_min = (level * 2 + maglevel * 3) * min_multiplier local damage_max = (level * 2 + maglevel * 3) * max_multiplier local damage_formula = math.random(damage_min,damage_max) doSendDistanceShoot(getCreaturePosition(getNpcCid( )), getThingPos(monster_table[i]), shoot_effect) doSendMagicEffect(getThingPos(monster_table[i]),hit_effect) doSendAnimatedText(getThingPos(monster_table[i]),damage_formula,damage_colour) doCreatureAddHealth(monster_table[i],-damage_formula) check_clock = os.clock() focus = 0 end elseif table.getn(monster_table) < 1 then focus = 0 check_clock = os.clock() end end end focus = 0 end Agradeço desde já
  20. Procurei aqui pelo forum, e não achei um NPC de Bank que fosse tão perfeito como este que estou postando... Eu mesmo havia postado há alguns dias atrás um NPC de Bank, mas não é tão bom quanto este... Detalhes do NPC: Executa as funções como do Tibia Global. Deposit, Transfer, Withdraw, Change Gold, Change Platinum, Change Crystal... Funcionando perfeitamente... #Testado' Vamos ao que interessa. Crie um arquivo chamado "bank.xml" na pasta "data / npc"... Cole o código abaixo dentro do arquivo: <?xml version="1.0" encoding="UTF-8"?> <npc name="BankMan" script="data/npc/scripts/bank.lua" walkinterval="25" floorchange="0" access="5" > <health now="150" max="150"/> <look type="132" head="115" body="0" legs="114" feet="0" addons="3" corpse="2212"/> <parameters> <parameter key="message_greet" value="Welcome |PLAYERNAME|! Here, you can {deposit}, {withdraw} or {transfer} your money from your bank account. I can change your coins too."/> <parameter key="message_alreadyfocused" value="You are drunked ? I talk with you."/> <parameter key="message_farewell" value="Goodbye. I wanna see your money... oh you again."/> </parameters> </npc> Salve e feche o arquivo. Agora vá na pasta Scripts e crie um arquivo chamado "bank.lua" e cole o código abaixo dentro do mesmo: local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid --------------------MESSAGES------------------------------------------------------------------------------ if msgcontains(msg, 'deposit') then selfSay('Please tell me how much gold it is you would like to deposit.', cid) talkState[talkUser] = 1 elseif msgcontains(msg, 'withdraw') then selfSay('Please tell me how much gold you would like to withdraw.', cid) talkState[talkUser] = 3 elseif msgcontains(msg, 'transfer') then selfSay('Please tell me the amount of gold coins you would like to transfer.', cid) talkState[talkUser] = 5 elseif msgcontains(msg, 'change gold') then selfSay('How many platinum coins do you want to get?', cid) talkState[talkUser] = 8 elseif msgcontains(msg, 'change platinum') then selfSay('Do you want to change your platinum coins to gold or crystal?', cid) talkState[talkUser] = 10 elseif msgcontains(msg, 'change crystal') then selfSay('How many crystal coins do you want to change to platinum?', cid) talkState[talkUser] = 15 elseif msgcontains(msg, 'balance') then n = getPlayerBalance(cid) selfSay('Your balance are '..n..' golds.', cid) talkState[talkUser] = 0 ----------------------DEPOSIT------------------------------------------------------- elseif talkState[talkUser] == 1 then if msgcontains(msg, 'all') then n = getPlayerMoney(cid) selfSay('Do you want deposit '..n..' golds ?', cid) talkState[talkUser] = 2 else n = getNumber(msg) selfSay('Do you want deposit '..n..' golds ?', cid) talkState[talkUser] = 2 end elseif talkState[talkUser] == 2 then if msgcontains(msg, 'yes') then if getPlayerMoney(cid) >= n then doPlayerDepositMoney(cid,n) selfSay('Sucessfull. Now your balance account is ' ..getPlayerBalance(cid)..' golds.', cid) talkState[talkUser] = 0 else selfSay('You don\'t have money.', cid) end else selfSay('Ok then', cid) end ----------------------WITHDRAW------------------------------------------------------------------------------------- elseif talkState[talkUser] == 3 then if msgcontains(msg, 'all') then n = getPlayerBalance(cid) selfSay('Do you want withdraw '..n..' golds ?', cid) talkState[talkUser] = 4 else n = getNumber(msg) selfSay('Do you want withdraw '..n..' golds ?', cid) talkState[talkUser] = 4 end elseif talkState[talkUser] == 4 then if msgcontains(msg, 'yes') then if getPlayerBalance(cid) >= n then doPlayerWithdrawMoney(cid, n) selfSay('Here you are, '..n..' gold. Now your balance account is ' ..getPlayerBalance(cid)..' golds.', cid) talkState[talkUser] = 0 else selfSay('There is not enough gold on your account', cid) end else selfSay('Ok then', cid) end ----------------------TRANSFER---------------------------------------------------------------------------------------- elseif talkState[talkUser] == 5 then if msgcontains(msg, 'all') then n = getPlayerBalance(cid) selfSay('Who would you like transfer '..n..' gold to?', cid) talkState[talkUser] = 6 else n = getNumber(msg) selfSay('Who would you like transfer '..n..' gold to?', cid) talkState[talkUser] = 6 end elseif talkState[talkUser] == 6 then p = msg selfSay('So you would like to transfer '..n..' gold to '..p..'?', cid) talkState[talkUser] = 7 elseif talkState[talkUser] == 7 then if msgcontains(msg, 'yes') then if getPlayerBalance(cid) >= n then if doPlayerTransferMoneyTo(cid, p, n) == TRUE then selfSay('You have transferred '..n..' gold to '..p..' and your account balance is '..getPlayerBalance(cid)..' golds.', cid) talkState[talkUser] = 0 else selfSay('This player does not exist. Please tell me a valid name!', cid) talkState[talkUser] = 0 end else selfSay('There is not enough gold on your account', cid) talkState[talkUser] = 0 end else selfSay('Ok then', cid) talkState[talkUser] = 0 end ----------------------CHANGE GOLD--------------------------------------------------------------------------------- elseif talkState[talkUser] == 8 then n = getNumber(msg) b = n * 100 selfSay('So I should change '..b..' of your gold coins to '..n..' platinum coins for you?', cid) talkState[talkUser] = 9 elseif talkState[talkUser] == 9 then if msgcontains(msg, 'yes') then if doPlayerRemoveItem(cid, 2148, b) == TRUE then doPlayerAddItem(cid, 2152, n) talkState[talkUser] = 0 else selfSay('You don\'t have money.', cid) talkState[talkUser] = 0 end else selfSay('Ok. We cancel.', cid) talkState[talkUser] = 0 end ---------------------CHANGE PLATINUM------------------------------------------------------------------------- elseif talkState[talkUser] == 10 then if msgcontains(msg, 'gold') then selfSay('How many platinum coins do you want to change to gold?', cid) talkState[talkUser] = 11 elseif msgcontains(msg, 'crystal') then selfSay('How many crystal coins do you want to get?', cid) talkState[talkUser] = 13 end elseif talkState[talkUser] == 11 then n = getNumber(msg) b = n * 100 selfSay('So I should change '..n..' of your platinum coins to '..b..' gold coins for you?', cid) talkState[talkUser] = 12 elseif talkState[talkUser] == 12 then if msgcontains(msg, 'yes') then if doPlayerRemoveItem(cid, 2152, n) == TRUE then doPlayerAddItem(cid, 2148, b) talkState[talkUser] = 0 else selfSay('You don\'t have money.', cid) talkState[talkUser] = 0 end else selfSay('Ok. We cancel.', cid) talkState[talkUser] = 0 end elseif talkState[talkUser] == 13 then n = getNumber(msg) b = n * 100 selfSay('So I should change '..b..' of your platinum coins to '..n..' crystal coins for you?', cid) talkState[talkUser] = 14 elseif talkState[talkUser] == 14 then if msgcontains(msg, 'yes') then if doPlayerRemoveItem(cid, 2152, b) == TRUE then doPlayerAddItem(cid, 2160, n) talkState[talkUser] = 0 else selfSay('You don\'t have money.', cid) talkState[talkUser] = 0 end else selfSay('Ok. We cancel.', cid) talkState[talkUser] = 0 end ---------------------CHANGE CRYSTAL------------------------------------------------------------------------------- elseif talkState[talkUser] == 15 then n = getNumber(msg) b = n * 100 selfSay('So I should change '..n..' of your crystal coins to '..b..' platinum coins for you?', cid) talkState[talkUser] = 16 elseif talkState[talkUser] == 16 then if msgcontains(msg, 'yes') then if doPlayerRemoveItem(cid, 2160, n) == TRUE then doPlayerAddItem(cid, 2152, b) talkState[talkUser] = 0 else selfSay('You don\'t have money.', cid) talkState[talkUser] = 0 end else selfSay('Ok. We cancel.', cid) talkState[talkUser] = 0 end end end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) -- function maded by Gesior-- function getNumber(txt) --return number if its number and is > 0, else return 0 x = string.gsub(txt,"%a","") x = tonumber(x) if x ~= nill and x > 0 then return x else return 0 end end Salve o arquivo e feche-o. Agora seu NPC está pronto, basta adicioná-lo ao seu mapa usando o Map Editor. Espero que seja de utilidade de alguém... Créditos: Tibiaa4e (outro forum) Pequeno Tuto: Adriano Swatt Testado em: Versões do Client: 8.54 e 8.60. Versões da Distro: TFS 3.4.5, TFS 0.4 e Alissow 0.4.1. Espero que seja útil. Abraços'
  21. Bom galera, sei que o natal acabou de passar, porém esqueci de postar esse system antes... Fiz uma versão 2.0 do meu npc de natal (papai noel). Agora ao invés do bom velhinho entregar diretamente o item, vc recebe uma caixa que ao clicar vc recebe um item 100% aleatorio (dentre os itens que foram programados dentro do script). Funciona assim: o player vai até o papai noel e fala: hi, aí o papai noel fala ho-ho-ho... aí o player responde sim (ou yes) e então o player recebe uma caixa. Ao clicar na caixa, o player recebe um dos itens, que estiverem programados no script, de forma aleatoria. Então vamo lá. Pra adicionar esse system, primeiro vá na pasta data/npc e crie um arquivo chamado Papai Noel.xml e coloque isso dentro: <?xml version="1.0" encoding="UTF-8"?> <npc name="Papai Noel" script="data/npc/scripts/papai_noel.lua" walkinterval="1500" speed="100" walkradius="2" floorchange="0"> <health max="100" now="100"/> <look type="160" head="0" body="113" legs="94" feet="132" addons="0" mount="0"/> <parameters> <!--MESSAGES--> <parameter key="message_greet" value="HO-HO-HO, |PLAYERNAME| bem-vindo. Voce gostaria de um presente?"/> <parameter key="message_farewell" value="HO-HO-HO, tenha um feliz natal, |PLAYERNAME|."/> </parameters> </npc> Agora vá na pasta data/npc/scripts e crie um arquivo chamado papai_noel.lua e coloque isso dentro: Agora vá na pasta data/actions e adicione essa tag dentro do arquivo actions.xml: <action itemid="11401" event="script" value="giftbox.lua"/> Agora va na pasta data/actions/scripts e crie um arquivo chamado giftbox.lua e coloque isso dentro: local items = { [1]=2160, --ID do item 1 [2]=2157, --ID do item 2 [3]=2121} --ID do item 3 local stor = (11401+os.date("%Y")) --Nao mexa function onUse(cid) if getPlayerStorageValue(cid, stor) ~= 1 then a = math.random(1, #items) doPlayerAddItem(cid, items[a], 1) setPlayerStorageValue(cid, stor, 1) else doPlayerSendCancel(cid, "Voce ja pegou seu presente.") end doPlayerRemoveItem(cid, 11401, 1) return true end E isso é tudo pessoal!
  22. Olá pessoal, gostaria de saber como posso adicionar um sistema de cassino por npc automatico, como este na imagen abaixo
  23. Olá, eu quero que algum mago das programações em .lua me crie um npc pra mim, este ira fazer a promote de vocations (royal paladin, elite knight, elder druid e master sorc) eu suas evoluões no OT (lord paladin, monster knight, majestyc druid e supreme sorc... vocações by Fox world [estão na sequencia, exemplo :sorcerer 1 master sorcerer 5 e supreme sorcerer 9]) a promotion vai ser de graça e n precisa de lvl, o nome do npc vai ser Mestre raikatu... dialogo: Olá eu sou o Mestre Raikatu, oque você quer comigo? promotion/ Eu posso lhe ensinar uma nova promotion, voce aceita? yes/no (se no) Então adeus jovém gafanhoto (se yes) Parabéns você evoluiu sua promotion! bye Siga sua jornada por esta nova era a aparencia fica a criterio do scripter, dou REP+++ muito obrigado... up!
  24. Olá, A Script e simples, eu ate já encontrei aqui no TK! Mais tipo, o jogador fala " Hi " dps " Nome " e o Npc não cobra nada, e ainda não troca o nome.. o Npc que eu quero ele deve coletar o item e trocar o nome do jogador, logo isso relogar. Mais ou menos assim: Jogador: Hi Npc: Olha Fulano, Deseja trocar seu nome por apenas 5 Pontos? Jogador: Yes Npc: Ok, Qual o nome Desejado? Jogador: NooBEmAcAo <<< Apos isso coletar o item e trocar o nome e relogar ( não precisa estar na ordem, eu arrumo ) OBS: BEM EXPLICADO, SOU BURRO! Quem puder me ajudar dou REP++ Obg^^
  25. Como o titulo já diz tudo, alguém poderia fazer ?, npc que teleporta vocações pra locais diferente em troca de itens ?

Open Tibia Server

Quer aprender a criar seu próprio servidor de Tibia? Então está no lugar certo, aqui você encontrará milhares de tutorias, scripts, códigos, mapas e utilitários para que você possa fazer o seu próprio servidor de Tibia começando do zero.

Redes Sociais

Anuncie no Tibia King

Precisa de mais visibilidade em seus projetos? Quer fazer um plano publicitário para o seu servidor? Anuncie no Tibia King e faça sua divulgação, possuímos centenas de acessos simultâneos e milhares diários, com certeza será a sua solução!

×
×
  • Create New...