• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Can't talk to npc

taha94

New Member
Joined
Jun 12, 2009
Messages
168
Reaction score
0
Location
Sweden
When i try to talk with the npc's in my server they don't respond and i get this error

PHP:
[19:30:44.936] [Error - NpcScript Interface] 
[19:30:44.936] data/npc/scripts/furniture.lua:onCreatureSay
[19:30:44.936] Description: 
[19:30:44.936] data/npc/lib/npcsystem/npchandler.lua:551: attempt to call global 'getDistanceTo' (a nil value)
[19:30:44.936] stack traceback:
[19:30:44.936] 	data/npc/lib/npcsystem/npchandler.lua:551: in function 'isInRange'
[19:30:44.936] 	data/npc/lib/npcsystem/npchandler.lua:374: in function 'onCreatureSay'
[19:30:44.936] 	data/npc/scripts/furniture.lua:7: in function <data/npc/scripts/furniture.lua:7>

[19:30:44.936] [Error - NpcScript Interface] 
[19:30:44.936] data/npc/scripts/loot.lua:onCreatureSay
[19:30:44.936] Description: 
[19:30:44.936] data/npc/lib/npcsystem/npchandler.lua:551: attempt to call global 'getDistanceTo' (a nil value)
[19:30:44.936] stack traceback:
[19:30:44.936] 	data/npc/lib/npcsystem/npchandler.lua:551: in function 'isInRange'
[19:30:44.936] 	data/npc/lib/npcsystem/npchandler.lua:374: in function 'onCreatureSay'
[19:30:44.936] 	data/npc/scripts/loot.lua:7: in function <data/npc/scripts/loot.lua:7>

And this
PHP:
[19:30:09.150] [Error - NpcScript Interface] 
[19:30:09.150] data/npc/scripts/runes.lua:onCreatureSay
[19:30:09.150] Description: 
[19:30:09.150] data/npc/lib/npcsystem/npchandler.lua:551: attempt to call global 'getDistanceTo' (a nil value)
[19:30:09.150] stack traceback:
[19:30:09.150] 	data/npc/lib/npcsystem/npchandler.lua:551: in function 'isInRange'
[19:30:09.150] 	data/npc/lib/npcsystem/npchandler.lua:374: in function 'onCreatureSay'
[19:30:09.150] 	data/npc/scripts/runes.lua:8: in function <data/npc/scripts/runes.lua:8>
 
I get this now
[19:58:18.987] [Error - NpcScript Interface]
[19:58:18.987] data/npc/scripts/runes.lua:eek:nCreatureSay
[19:58:18.988] Description:
[19:58:18.988] data/npc/lib/npcsystem/npchandler.lua:551: attempt to call global 'getDistanceTo' (a nil value)
[19:58:18.988] stack traceback:
[19:58:18.988] data/npc/lib/npcsystem/npchandler.lua:551: in function 'isInRange'
[19:58:18.988] data/npc/lib/npcsystem/npchandler.lua:374: in function 'onCreatureSay'
[19:58:18.988] data/npc/scripts/runes.lua:8: in function <data/npc/scripts/runes.lua:8>

[19:58:18.988] [Error - NpcScript Interface]
[19:58:18.988] data/npc/scripts/furniture.lua:eek:nCreatureSay
[19:58:18.988] Description:
[19:58:18.988] data/npc/lib/npcsystem/npchandler.lua:551: attempt to call global 'getDistanceTo' (a nil value)
[19:58:18.988] stack trace
 
this now

[20:22:19.705] [Error - NpcScript Interface]
[20:22:19.705] data/npc/scripts/runes.lua:eek:nCreatureSay
[20:22:19.705] Description:
[20:22:19.705] data/npc/lib/npcsystem/npchandler.lua:558: attempt to call global 'getDistanceTo' (a nil value)
[20:22:19.705] stack traceback:
[20:22:19.705] data/npc/lib/npcsystem/npchandler.lua:558: in function 'isInRange'
[20:22:19.705] data/npc/lib/npcsystem/npchandler.lua:381: in function 'onCreatureSay'
[20:22:19.705] data/npc/scripts/runes.lua:8: in function <data/npc/scripts/runes.lua:8>

[20:22:19.705] [Error - NpcScript Interface]
[20:22:19.705] data/npc/scripts/furniture.lua:eek:nCreatureSay
[20:22:19.705] Description:

same errors all the time
 
PHP:
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 shopModule = ShopModule:new()
npcHandler:addModule(shopModule)

shopModule:addBuyableItem({'spellbook'}, 2175, 150, 'spellbook')

shopModule:addBuyableItem({'small health'}, 8704, 20, 'small health potion')
shopModule:addBuyableItem({'health potion'}, 7618, 45, 'health potion')
shopModule:addBuyableItem({'mana potion'}, 7620, 50, 'mana potion')
shopModule:addBuyableItem({'strong health'}, 7588, 100, 'strong health potion')
shopModule:addBuyableItem({'strong mana'}, 7589, 80, 'strong mana potion')
shopModule:addBuyableItem({'great health'}, 7591, 190, 'great health potion')
shopModule:addBuyableItem({'great mana'}, 7590, 120, 'great mana potion')
shopModule:addBuyableItem({'great spirit'}, 8472, 190, 'great spirit potion')
shopModule:addBuyableItem({'ultimate health'}, 8473, 310, 'ultimate health potion')
shopModule:addBuyableItem({'antidote potion'}, 8474, 50, '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({'blank rune'},         2260, 10, 'blank rune')
shopModule:addBuyableItem({'animate dead'},         2316, 375,1, 'animate dead rune')
shopModule:addBuyableItem({'antidote'},         2266, 65,1, 'antidote rune')
shopModule:addBuyableItem({'avalanche'},         2274, 180,4, 'avalanche rune')
shopModule:addBuyableItem({'chameleon'},         2291, 210,1, 'chameleon rune')
shopModule:addBuyableItem({'convince creature'},     2290, 80,1, 'convince creature rune')
shopModule:addBuyableItem({'desintegrate'},         2310, 80,3, 'desintegrate rune')
shopModule:addBuyableItem({'destroy field'},         2261, 45,3,  'destroy field')
shopModule:addBuyableItem({'energy bomb'},         2262, 325,2, 'energy bomb rune')
shopModule:addBuyableItem({'energy field'},         2277, 115,3, 'energy field')
shopModule:addBuyableItem({'energy wall'},         2279, 340,4, 'energy wall rune')
shopModule:addBuyableItem({'explosion'},         2313, 190,6, 'explosion rune')
shopModule:addBuyableItem({'fire bomb'},         2305, 235,2, 'fire bomb rune')
shopModule:addBuyableItem({'fire field'},         2301, 85,3,  'fire field rune')
shopModule:addBuyableItem({'fire wall'},         2303, 245,4, 'fire wall rune')
shopModule:addBuyableItem({'fireball'},         2302, 150,5,  'fire ball')
shopModule:addBuyableItem({'great fireball'},         2304, 180,4, 'great fireball rune')
shopModule:addBuyableItem({'heavy magic missile'},     2311, 120,10, 'heavy magic missile rune')
shopModule:addBuyableItem({'holy missile missile'},     2295, 80,5, 'holy missile rune')
shopModule:addBuyableItem({'icicle'},             2271, 150,5, 'icicle rune')
shopModule:addBuyableItem({'intense healing'},         2265, 95,1, 'intense healing rune')
shopModule:addBuyableItem({'light magic missile'},     2287, 40,10, 'light magic missile rune')
shopModule:addBuyableItem({'magic wall'},         2293, 350,3, 'magic wall rune')
shopModule:addBuyableItem({'paralyze'},         2278, 700,1, 'paralyze rune')
shopModule:addBuyableItem({'poison bomb'},         2286, 170,2, 'poison bomb rune')
shopModule:addBuyableItem({'poison field'},         2285, 65,3,  'poison field')
shopModule:addBuyableItem({'poison wall'},         2289, 210,4, 'poison wall rune')
shopModule:addBuyableItem({'soulfire'},         2308, 140,3, 'soulfire rune')
shopModule:addBuyableItem({'stalagmite'},         2292, 120,10, 'stalagmite rune')
shopModule:addBuyableItem({'stone shower'},         2288, 150,4, 'stoneshower rune')
shopModule:addBuyableItem({'sudden death'},         2268, 325,1, 'sudden death rune')
shopModule:addBuyableItem({'thunderstorm'},         2315, 150,4, 'thunderstorm rune')
shopModule:addBuyableItem({'ultimate healing'},     2273, 175,3, 'ultimate healing rune')
shopModule:addBuyableItem({'wild growth'},         2269, 320,2, 'wild growth rune')

shopModule:addBuyableItemContainer({'bp blank'},     1998, 2260, 220, 1, 'bp blank rune')

shopModule:addBuyableItemContainer({'bp animate dead'},     1998, 2316, 7520, 1, 'bp animate dead rune')
shopModule:addBuyableItemContainer({'bp antidote'},         2003, 2266, 1320, 1, 'bp antidote rune')
shopModule:addBuyableItemContainer({'bp avalanche'},         2002, 2274, 3620,4, 'bp avalanche rune')
shopModule:addBuyableItemContainer({'bp chameleon'},         1998, 2291, 4220,1, 'bp chameleon rune')
shopModule:addBuyableItemContainer({'bp convince creature'},     1998, 2290, 1620,1, 'bp convince creature rune')
shopModule:addBuyableItemContainer({'bp desintegrate'},     2001, 2310, 1620,3, 'bp desintegrate rune')
shopModule:addBuyableItemContainer({'bp destroy field'},     2003, 2261, 920,3,  'bp destroy field')
shopModule:addBuyableItemContainer({'bp energy bomb'},         2003, 2262, 6520,2, 'bp energy bomb rune')
shopModule:addBuyableItemContainer({'bp energy field'},     1998, 2277, 2320,3, 'bp energy field')
shopModule:addBuyableItemContainer({'bp energy wall'},         2002, 2279, 6820,4, 'bp energy wall rune')
shopModule:addBuyableItemContainer({'bp explosion'},         2001, 2313, 3820,6, 'bp explosion rune')
shopModule:addBuyableItemContainer({'bp fire bomb'},         2000, 2305, 4720,2, 'bp fire bomb rune')
shopModule:addBuyableItemContainer({'bp fire field'},         2000, 2301, 1720,3,  'bp fire field rune')
shopModule:addBuyableItemContainer({'bp fire wall'},         2000, 2303, 4920,4, 'bp fire wall rune')
shopModule:addBuyableItemContainer({'bp fireball'},         2000, 2302, 3020,5,  'bp fire ball')
shopModule:addBuyableItemContainer({'bp great fireball'},     2000, 2304, 3620,4, 'bp great fireball rune')
shopModule:addBuyableItemContainer({'bp heavy magic missile'},     2001, 2311, 2420,10, 'bp heavy magic missile rune')
shopModule:addBuyableItemContainer({'bp holy missile'},     1999, 2295, 1600,5, 'bp holy missile rune')
shopModule:addBuyableItemContainer({'bp icicle'},         2002, 2271, 3020,5, 'bp icicle rune')
shopModule:addBuyableItemContainer({'bp intense healing'},     2003, 2265, 1920,1, 'bp intense healing rune')
shopModule:addBuyableItemContainer({'bp light magic missile'},     1998, 2287, 820,10, 'bp light magic missile rune')
shopModule:addBuyableItemContainer({'bp magic wall'},         1999, 2293, 7020,3, 'bp magic wall rune')
shopModule:addBuyableItemContainer({'bp paralyze'},         2002, 2278, 1420,1, 'bp paralyze rune')
shopModule:addBuyableItemContainer({'bp poison bomb'},         1998, 2286, 3420,2, 'bp poison bomb rune')
shopModule:addBuyableItemContainer({'bp poison field'},     1998, 2285, 1320,3,  'bp poison field')
shopModule:addBuyableItemContainer({'bp poison wall'},         1998, 2289, 4220,4, 'bp poison wall rune')
shopModule:addBuyableItemContainer({'bp soulfire'},         2000, 2308, 2820,3, 'bp soulfire rune')
shopModule:addBuyableItemContainer({'bp stalagmite'},         1998, 2292, 2400,10, 'bp stalagmite rune')
shopModule:addBuyableItemContainer({'bp stone shower'},     1999, 2288, 3020,4, 'bp stoneshower rune')
shopModule:addBuyableItemContainer({'bp sudden death'},     2003, 2268, 6520,3, 'bp sudden death rune')
shopModule:addBuyableItemContainer({'bp thunderstorm'},     1999, 2315, 3020,4, 'bp thunderstorm rune')
shopModule:addBuyableItemContainer({'bp ultimate healing'},     2002, 2273, 3520,3, 'bp ultimate healing rune')
shopModule:addBuyableItemContainer({'bp wild growth'},         2002, 2269, 6420,2, 'bp wild growth rune')

shopModule:addBuyableItemContainer({'bp slhp'}, 2000, 8704, 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, 8472, 3800, 1, 'backpack of great spirit potions')
shopModule:addBuyableItemContainer({'bp uhp'}, 2000, 8473, 6200, 1, 'backpack of ultimate health potions')
shopModule:addBuyableItemContainer({'bp ap'}, 2002, 8474, 2000, 1, 'backpack of antidote 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')

npcHandler:addModule(FocusModule:new())


Isn't there a problem with npchandler
 
Last edited:
in npchandler.lua. Replace this function.

Code:
function NpcHandler:isInRange(cid)
        local distance = getDistanceBetween(getCreaturePosition(getNpcCid()), getCreaturePosition(cid))
        if(distance == -1) then
            return false
        end

        return (distance <= self.talkRadius)
    end
 
So something like this
-- Returns true if cid is within the talkRadius of this npc.
function NpcHandler:isInRange(cid)
local distance = getDistanceBetween(getCreaturePosition(getNpcCid()), getCreaturePosition(cid))
if(distance == -1) then
return false
end

return (distance <= self.talkRadius)
end
local distance = getDistanceTo(cid) or -1
if(distance == -1) then
return false
end

plus do i have to restart the server?
 
Reload the NPCs after you have replaced the function NpcHandler:isInRange(cid).

Code:
[COLOR=#333333]-- Returns true if cid is within the talkRadius of this npc.[/COLOR]
function NpcHandler:isInRange(cid)
        local distance = getDistanceBetween(getCreaturePosition(getNpcCid()), getCreaturePosition(cid))
        if(distance == -1) then
            return false
        end
 
        return (distance <= self.talkRadius)
    end
 
So like this if im not mistaken

PHP:
-- Advanced NPC System (Created by Jiddo),
-- Modified by Talaturen.

if(NpcHandler == nil) then
	-- Constant talkdelay behaviors.
	TALKDELAY_NONE = 0 -- No talkdelay. Npc will reply immedeatly.
	TALKDELAY_ONTHINK = 1 -- Talkdelay handled through the onThink callback function. (Default)
	TALKDELAY_EVENT = 2 -- Not yet implemented

	-- Currently applied talkdelay behavior. TALKDELAY_ONTHINK is default.
	NPCHANDLER_TALKDELAY = TALKDELAY_ONTHINK

	-- Constant conversation behaviors.
	CONVERSATION_DEFAULT = 0 -- Conversation through default window, like it was before 8.2 update.
	CONVERSATION_PRIVATE = 1 -- Conversation through NPCs chat window, as of 8.2 update. (Default)
		--Small Note: Private conversations also means the NPC will use multi-focus system.

	-- Currently applied conversation behavior. CONVERSATION_PRIVATE is default.
	NPCHANDLER_CONVBEHAVIOR = CONVERSATION_PRIVATE

	-- Constant indexes for defining default messages.
	MESSAGE_GREET 			= 1 -- When the player greets the npc.
	MESSAGE_FAREWELL 		= 2 -- When the player unGreets the npc.
	MESSAGE_BUY 			= 3 -- When the npc asks the player if he wants to buy something.
	MESSAGE_ONBUY 			= 4 -- When the player successfully buys something via talk.
	MESSAGE_BOUGHT			= 5 -- When the player bought something through the shop window.
	MESSAGE_SELL 			= 6 -- When the npc asks the player if he wants to sell something.
	MESSAGE_ONSELL 			= 7 -- When the player successfully sells something via talk.
	MESSAGE_SOLD			= 8 -- When the player sold something through the shop window.
	MESSAGE_MISSINGMONEY		= 9 -- When the player does not have enough money.
	MESSAGE_NEEDMONEY		= 10 -- Same as above, used for shop window.
	MESSAGE_MISSINGITEM		= 11 -- When the player is trying to sell an item he does not have.
	MESSAGE_NEEDITEM		= 12 -- Same as above, used for shop window.
	MESSAGE_NEEDSPACE 		= 13 -- When the player don't have any space to buy an item
	MESSAGE_NEEDMORESPACE		= 14 -- When the player has some space to buy an item, but not enough space
	MESSAGE_IDLETIMEOUT		= 15 -- When the player has been idle for longer then idleTime allows.
	MESSAGE_WALKAWAY		= 16 -- When the player walks out of the talkRadius of the npc.
	MESSAGE_DECLINE			= 17 -- When the player says no to something.
	MESSAGE_SENDTRADE		= 18 -- When the npc sends the trade window to the player
	MESSAGE_NOSHOP			= 19 -- When the npc's shop is requested but he doesn't have any
	MESSAGE_ONCLOSESHOP		= 20 -- When the player closes the npc's shop window
	MESSAGE_ALREADYFOCUSED		= 21 -- When the player already has the focus of this npc.
	MESSAGE_PLACEDINQUEUE		= 22 -- When the player has been placed in the costumer queue.

	-- Constant indexes for callback functions. These are also used for module callback ids.
	CALLBACK_CREATURE_APPEAR 	= 1
	CALLBACK_CREATURE_DISAPPEAR	= 2
	CALLBACK_CREATURE_SAY 		= 3
	CALLBACK_ONTHINK 		= 4
	CALLBACK_GREET 			= 5
	CALLBACK_FAREWELL 		= 6
	CALLBACK_MESSAGE_DEFAULT 	= 7
	CALLBACK_PLAYER_ENDTRADE 	= 8
	CALLBACK_PLAYER_CLOSECHANNEL	= 9
	CALLBACK_ONBUY			= 10
	CALLBACK_ONSELL			= 11

	-- Addidional module callback ids
	CALLBACK_MODULE_INIT		= 12
	CALLBACK_MODULE_RESET		= 13

	-- Constant strings defining the keywords to replace in the default messages.
	TAG_PLAYERNAME = '|PLAYERNAME|'
	TAG_ITEMCOUNT = '|ITEMCOUNT|'
	TAG_TOTALCOST = '|TOTALCOST|'
	TAG_ITEMNAME = '|ITEMNAME|'
	TAG_QUEUESIZE = '|QUEUESIZE|'

	NpcHandler = {
		keywordHandler = nil,
		focuses = nil,
		talkStart = nil,
		idleTime = 90,
		talkRadius = 4,
		talkDelayTime = 1, -- Seconds to delay outgoing messages.
		queue = nil,
		talkDelay = nil,
		callbackFunctions = nil,
		modules = nil,
		shopItems = nil, -- They must be here since ShopModule uses "static" functions
		messages = {
			-- These are the default replies of all npcs. They can/should be changed individually for each npc.
			[MESSAGE_GREET] 	= 'Welcome, |PLAYERNAME|! I have been expecting you.',
			[MESSAGE_FAREWELL] 	= 'Good bye, |PLAYERNAME|!',
			[MESSAGE_BUY] 		= 'Do you want to buy |ITEMCOUNT| |ITEMNAME| for |TOTALCOST| gold coins?',
			[MESSAGE_ONBUY] 	= 'It was a pleasure doing business with you.',
			[MESSAGE_BOUGHT] 	= 'Bought |ITEMCOUNT|x |ITEMNAME| for |TOTALCOST| gold.',
			[MESSAGE_SELL] 		= 'Do you want to sell |ITEMCOUNT| |ITEMNAME| for |TOTALCOST| gold coins?',
			[MESSAGE_ONSELL] 	= 'Thank you for this |ITEMNAME|, |PLAYERNAME| gold.',
			[MESSAGE_SOLD]	 	= 'Sold |ITEMCOUNT|x |ITEMNAME| for |TOTALCOST| gold.',
			[MESSAGE_MISSINGMONEY]	= 'Sorry, you don\'t have enough money.',
			[MESSAGE_NEEDMONEY] 	= 'You do not have enough money.',
			[MESSAGE_MISSINGITEM] 	= 'You don\'t even have that item, |PLAYERNAME|!',
			[MESSAGE_NEEDITEM]	= 'You do not have this object.',
			[MESSAGE_NEEDSPACE]	= 'You do not have enough capacity.',
			[MESSAGE_NEEDMORESPACE]	= 'You do not have enough capacity for all items.',
			[MESSAGE_IDLETIMEOUT] 	= 'Next, please!',
			[MESSAGE_WALKAWAY] 	= 'How rude!',
			[MESSAGE_DECLINE]	= 'Not good enough, is it... ?',
			[MESSAGE_SENDTRADE]	= 'Here\'s my offer, |PLAYERNAME|. Don\'t you like it?',
			[MESSAGE_NOSHOP]	= 'Sorry, I\'m not offering anything.',
			[MESSAGE_ONCLOSESHOP]	= 'Thank you, come back when you want something more.',
			[MESSAGE_ALREADYFOCUSED]= '|PLAYERNAME|! I am already talking to you...',
			[MESSAGE_PLACEDINQUEUE] = '|PLAYERNAME|, please wait for your turn. There are |QUEUESIZE| customers before you.'
		}
	}

-- Returns true if cid is within the talkRadius of this npc.
function NpcHandler:isInRange(cid)
        local distance = getDistanceBetween(getCreaturePosition(getNpcCid()), getCreaturePosition(cid))
        if(distance == -1) then
            return false
        end
 
        return (distance <= self.talkRadius)
    end
		obj.talkDelay = {}
		obj.keywordHandler = keywordHandler
		obj.messages = {}
		obj.shopItems = {}

		setmetatable(obj.messages, self.messages)
		self.messages.__index = self.messages

		setmetatable(obj, self)
		self.__index = self
		return obj
	end

	-- Re-defines the maximum idle time allowed for a player when talking to this npc.
	function NpcHandler:setMaxIdleTime(newTime)
		self.idleTime = newTime
	end

	-- Attackes a new keyword handler to this npchandler
	function NpcHandler:setKeywordHandler(newHandler)
		self.keywordHandler = newHandler
	end

	-- Function used to change the focus of this npc.
	function NpcHandler:addFocus(newFocus)
		if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
			if(self:isFocused(newFocus)) then
				return
			end

			table.insert(self.focuses, newFocus)
		else
			self.focuses = newFocus
		end

		self:updateFocus()
	end
	NpcHandler.changeFocus = NpcHandler.addFocus --"changeFocus" looks better for CONVERSATION_DEFAULT

	-- Function used to verify if npc is focused to certain player
	function NpcHandler:isFocused(focus)
		if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
			for k,v in pairs(self.focuses) do
				if v == focus then
					return true
				end
			end

			return false
		end

		return (self.focuses == focus)
	end

	-- This function should be called on each onThink and makes sure the npc faces the player it is talking to.
	--	Should also be called whenever a new player is focused.
	function NpcHandler:updateFocus()
		if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
			for pos, focus in pairs(self.focuses) do
				if(focus ~= nil) then
					doNpcSetCreatureFocus(focus)
					return
				end
			end

			doNpcSetCreatureFocus(0)
		else
			doNpcSetCreatureFocus(self.focuses)
		end
	end

	-- Used when the npc should un-focus the player.
	function NpcHandler:releaseFocus(focus)
		if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
			if(not self:isFocused(focus)) then
				return
			end

			local pos = nil
			for k,v in pairs(self.focuses) do
				if v == focus then
					pos = k
				end
			end
			table.remove(self.focuses, pos)
			self.talkStart[focus] = nil
			closeShopWindow(focus) --Even if it can not exist, we need to prevent it.
			self:updateFocus()
		else
			closeShopWindow(focus)
			self:changeFocus(0)
		end
	end

	-- Returns the callback function with the specified id or nil if no such callback function exists.
	function NpcHandler:getCallback(id)
		local ret = nil
		if(self.callbackFunctions ~= nil) then
			ret = self.callbackFunctions[id]
		end

		return ret
	end

	-- Changes the callback function for the given id to callback.
	function NpcHandler:setCallback(id, callback)
		if(self.callbackFunctions ~= nil) then
			self.callbackFunctions[id] = callback
		end
	end

	-- Adds a module to this npchandler and inits it.
	function NpcHandler:addModule(module)
		if(self.modules == nil or module == nil) then
			return false
		end

		module:init(self)
		if(module.parseParameters ~= nil) then
			module:parseParameters()
		end

		table.insert(self.modules, module)
		return true
	end

	-- Calls the callback function represented by id for all modules added to this npchandler with the given arguments.
	function NpcHandler:processModuleCallback(id, ...)
		local ret = true
		for i, module in pairs(self.modules) do
			local tmpRet = true
			if(id == CALLBACK_CREATURE_APPEAR and module.callbackOnCreatureAppear ~= nil) then
				tmpRet = module:callbackOnCreatureAppear(unpack(arg))
			elseif(id == CALLBACK_CREATURE_DISAPPEAR and module.callbackOnCreatureDisappear ~= nil) then
				tmpRet = module:callbackOnCreatureDisappear(unpack(arg))
			elseif(id == CALLBACK_CREATURE_SAY and module.callbackOnCreatureSay ~= nil) then
				tmpRet = module:callbackOnCreatureSay(unpack(arg))
			elseif(id == CALLBACK_PLAYER_ENDTRADE and module.callbackOnPlayerEndTrade ~= nil) then
				tmpRet = module:callbackOnPlayerEndTrade(unpack(arg))
			elseif(id == CALLBACK_PLAYER_CLOSECHANNEL and module.callbackOnPlayerCloseChannel ~= nil) then
				tmpRet = module:callbackOnPlayerCloseChannel(unpack(arg))
			elseif(id == CALLBACK_ONBUY and module.callbackOnBuy ~= nil) then
				tmpRet = module:callbackOnBuy(unpack(arg))
			elseif(id == CALLBACK_ONSELL and module.callbackOnSell ~= nil) then
				tmpRet = module:callbackOnSell(unpack(arg))
			elseif(id == CALLBACK_ONTHINK and module.callbackOnThink ~= nil) then
				tmpRet = module:callbackOnThink(unpack(arg))
			elseif(id == CALLBACK_GREET and module.callbackOnGreet ~= nil) then
				tmpRet = module:callbackOnGreet(unpack(arg))
			elseif(id == CALLBACK_FAREWELL and module.callbackOnFarewell ~= nil) then
				tmpRet = module:callbackOnFarewell(unpack(arg))
			elseif(id == CALLBACK_MESSAGE_DEFAULT and module.callbackOnMessageDefault ~= nil) then
				tmpRet = module:callbackOnMessageDefault(unpack(arg))
			elseif(id == CALLBACK_MODULE_RESET and module.callbackOnModuleReset ~= nil) then
				tmpRet = module:callbackOnModuleReset(unpack(arg))
			end

			if(not tmpRet) then
				ret = false
				break
			end
		end

		return ret
	end

	-- Returns the message represented by id.
	function NpcHandler:getMessage(id)
		local ret = nil
		if(self.messages ~= nil) then
			ret = self.messages[id]
		end

		return ret
	end

	-- Changes the default response message with the specified id to newMessage.
	function NpcHandler:setMessage(id, newMessage)
		if(self.messages ~= nil) then
			self.messages[id] = newMessage
		end
	end

	-- Translates all message tags found in msg using parseInfo
	function NpcHandler:parseMessage(msg, parseInfo)
		local ret = msg
		for search, replace in pairs(parseInfo) do
			ret = string.gsub(ret, search, replace)
		end

		return ret
	end

	-- Makes sure the npc un-focuses the currently focused player
	function NpcHandler:unGreet(cid)
		if(not self:isFocused(cid)) then
			return
		end

		local callback = self:getCallback(CALLBACK_FAREWELL)
		if(callback == nil or callback(cid)) then
			if(self:processModuleCallback(CALLBACK_FAREWELL)) then
				if(self.queue == nil or not self.queue:greetNext()) then
					local msg = self:getMessage(MESSAGE_FAREWELL)
					local parseInfo = { [TAG_PLAYERNAME] = getPlayerName(cid) }
					msg = self:parseMessage(msg, parseInfo)

					self:say(msg, cid)
					self:releaseFocus(cid)
					self:say(msg)
				end
			end
		end
	end

	-- Greets a new player.
	function NpcHandler:greet(cid)
		if(cid ~= 0) then
			local callback = self:getCallback(CALLBACK_GREET)
			if(callback == nil or callback(cid)) then
				if(self:processModuleCallback(CALLBACK_GREET, cid)) then
					local msg = self:getMessage(MESSAGE_GREET)
					local parseInfo = { [TAG_PLAYERNAME] = getCreatureName(cid) }
					msg = self:parseMessage(msg, parseInfo)

					self:say(msg)
					self:addFocus(cid)
					self:say(msg, cid)
				end
			end
		end
	end

	-- Handles onCreatureAppear events. If you with to handle this yourself, please use the CALLBACK_CREATURE_APPEAR callback.
	function NpcHandler:onCreatureAppear(cid)
		local callback = self:getCallback(CALLBACK_CREATURE_APPEAR)
		if(callback == nil or callback(cid)) then
			if(self:processModuleCallback(CALLBACK_CREATURE_APPEAR, cid)) then
				--
			end
		end
	end

	-- Handles onCreatureDisappear events. If you with to handle this yourself, please use the CALLBACK_CREATURE_DISAPPEAR callback.
	function NpcHandler:onCreatureDisappear(cid)
		local callback = self:getCallback(CALLBACK_CREATURE_DISAPPEAR)
		if(callback == nil or callback(cid)) then
			if(self:processModuleCallback(CALLBACK_CREATURE_DISAPPEAR, cid)) then
				if(self:isFocused(cid)) then
					self:unGreet(cid)
				end
			end
		end
	end

	-- Handles onCreatureSay events. If you with to handle this yourself, please use the CALLBACK_CREATURE_SAY callback.
	function NpcHandler:onCreatureSay(cid, class, msg)
		local callback = self:getCallback(CALLBACK_CREATURE_SAY)
		if(callback == nil or callback(cid, class, msg)) then
			if(self:processModuleCallback(CALLBACK_CREATURE_SAY, cid, class, msg)) then
				if(not self:isInRange(cid)) then
					return
				end

				if(self.keywordHandler ~= nil) then
					if((self:isFocused(cid) and (class == TALKTYPE_PRIVATE_PN or NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT)) or not self:isFocused(cid)) then
						local ret = self.keywordHandler:processMessage(cid, msg)
						if(not ret) then
							local callback = self:getCallback(CALLBACK_MESSAGE_DEFAULT)
							if(callback ~= nil and callback(cid, class, msg)) then
								if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
									self.talkStart[cid] = os.time()
								else
									self.talkStart = os.time()
								end
							end
						else
							if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
								self.talkStart[cid] = os.time()
							else
								self.talkStart = os.time()
							end
						end
					end
				end
			end
		end
	end

	-- Handles onPlayerEndTrade events. If you wish to handle this yourself, use the CALLBACK_PLAYER_ENDTRADE callback.
	function NpcHandler:onPlayerEndTrade(cid)
		local callback = self:getCallback(CALLBACK_PLAYER_ENDTRADE)
		if(callback == nil or callback(cid)) then
			if(self:processModuleCallback(CALLBACK_PLAYER_ENDTRADE, cid, class, msg)) then
				if(self:isFocused(cid)) then
					local parseInfo = { [TAG_PLAYERNAME] = getPlayerName(cid) }
					local msg = self:parseMessage(self:getMessage(MESSAGE_ONCLOSESHOP), parseInfo)
					self:say(msg, cid)
				end
			end
		end
	end

	-- Handles onPlayerCloseChannel events. If you wish to handle this yourself, use the CALLBACK_PLAYER_CLOSECHANNEL callback.
	function NpcHandler:onPlayerCloseChannel(cid)
		local callback = self:getCallback(CALLBACK_PLAYER_CLOSECHANNEL)
		if(callback == nil or callback(cid)) then
			if(self:processModuleCallback(CALLBACK_PLAYER_CLOSECHANNEL, cid, class, msg)) then
				if(self:isFocused(cid)) then
					self:unGreet(cid)
				end
			end
		end
	end

	-- Handles onBuy events. If you wish to handle this yourself, use the CALLBACK_ONBUY callback.
	function NpcHandler:onBuy(cid, itemid, subType, amount, ignoreCap, inBackpacks)
		local callback = self:getCallback(CALLBACK_ONBUY)
		if(callback == nil or callback(cid, itemid, subType, amount, ignoreCap, inBackpacks)) then
			if(self:processModuleCallback(CALLBACK_ONBUY, cid, itemid, subType, amount, ignoreCap, inBackpacks)) then
				--
			end
		end
	end

	-- Handles onSell events. If you wish to handle this yourself, use the CALLBACK_ONSELL callback.
	function NpcHandler:onSell(cid, itemid, subType, amount, ignoreCap, inBackpacks)
		local callback = self:getCallback(CALLBACK_ONSELL)
		if(callback == nil or callback(cid, itemid, subType, amount, ignoreCap, inBackpacks)) then
			if(self:processModuleCallback(CALLBACK_ONSELL, cid, itemid, subType, amount, ignoreCap, inBackpacks)) then
				--
			end
		end
	end

	-- Handles onThink events. If you wish to handle this yourself, please use the CALLBACK_ONTHINK callback.
	function NpcHandler:onThink()
		local callback = self:getCallback(CALLBACK_ONTHINK)
		if(callback == nil or callback()) then
			if(NPCHANDLER_TALKDELAY == TALKDELAY_ONTHINK) then
				if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
					for cid, talkDelay in pairs(self.talkDelay) do
						if(talkDelay.time ~= nil and talkDelay.message ~= nil and os.time() >= talkDelay.time) then
							selfSay(talkDelay.message, cid)
							self.talkDelay[cid] = nil
						end
					end
				elseif(self.talkDelay.time ~= nil and self.talkDelay.message ~= nil and os.time() >= self.talkDelay.time) then
					selfSay(self.talkDelay.message)
					self.talkDelay.time = nil
					self.talkDelay.message = nil
				end
			end

			if(self:processModuleCallback(CALLBACK_ONTHINK)) then
				if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
					for pos, focus in pairs(self.focuses) do
						if(focus ~= nil) then
							if(not self:isInRange(focus)) then
								self:onWalkAway(focus)
							elseif((os.time() - self.talkStart[focus]) > self.idleTime) then
								self:unGreet(focus)
							else
								self:updateFocus()
							end
						end
					end
				elseif(self.focuses ~= 0) then
					if(not self:isInRange(self.focuses)) then
						self:onWalkAway(self.focuses)
					elseif(os.time()-self.talkStart > self.idleTime) then
						self:unGreet(self.focuses)
					else
						self:updateFocus()
					end
				end
			end
		end
	end

	-- Tries to greet the player with the given cid.
	function NpcHandler:onGreet(cid)
		if(self:isInRange(cid)) then
			if(NPCHANDLER_CONVBEHAVIOR == CONVERSATION_PRIVATE) then
				if(not self:isFocused(cid)) then
					self:greet(cid)
					return
				end
			elseif(NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT) then
				if(self.focuses == 0) then
					self:greet(cid)
				elseif(self.focuses == cid) then
					local msg = self:getMessage(MESSAGE_ALREADYFOCUSED)
					local parseInfo = { [TAG_PLAYERNAME] = getCreatureName(cid) }
					msg = self:parseMessage(msg, parseInfo)
					self:say(msg)
				else
					if(not self.queue:isInQueue(cid)) then
						self.queue:push(cid)
					end

					local msg = self:getMessage(MESSAGE_PLACEDINQUEUE)
					local parseInfo = { [TAG_PLAYERNAME] = getCreatureName(cid), [TAG_QUEUESIZE] = self.queue:getSize() }
					msg = self:parseMessage(msg, parseInfo)
					self:say(msg)
				end
			end
		end
	end

	-- Simply calls the underlying unGreet function.
	function NpcHandler:onFarewell(cid)
		self:unGreet(cid)
	end

	-- Should be called on this npc's focus if the distance to focus is greater then talkRadius.
	function NpcHandler:onWalkAway(cid)
		if(self:isFocused(cid)) then
			local callback = self:getCallback(CALLBACK_CREATURE_DISAPPEAR)
			if(callback == nil or callback(cid)) then
				if(self:processModuleCallback(CALLBACK_CREATURE_DISAPPEAR, cid)) then
					if(self.queue == nil or not self.queue:greetNext()) then
						local msg = self:getMessage(MESSAGE_WALKAWAY)
						local parseInfo = { [TAG_PLAYERNAME] = getPlayerName(cid) }
						msg = self:parseMessage(msg, parseInfo)

						self:say(msg, cid)
						self:releaseFocus(cid)
						self:say(msg)
					end
				end
			end
		end
	end

	-- Returns true if cid is within the talkRadius of this npc.
function NpcHandler:isInRange(cid)
        local distance = getDistanceBetween(getCreaturePosition(getNpcCid()), getCreaturePosition(cid))
        if(distance == -1) then
            return false
        end
 
        return (distance <= self.talkRadius)
    end
		local distance = getDistanceTo(cid) or -1
		if(distance == -1) then
			return false
		end

		return (distance <= self.talkRadius)
	end

	-- Resets the npc into it's initial state (in regard of the keyrodhandler).
	--	All modules are also receiving a reset call through their callbackOnModuleReset function.
	function NpcHandler:resetNpc()
		if(self:processModuleCallback(CALLBACK_MODULE_RESET)) then
			self.keywordHandler:reset()
		end
	end

	-- Makes the npc represented by this instance of NpcHandler say something.
	--	This implements the currently set type of talkdelay.
	--	shallDelay is a boolean value. If it is false, the message is not delayed. Default value is false.
	function NpcHandler:say(message, focus, shallDelay)
		local shallDelay = shallDelay or false
		if(NPCHANDLER_TALKDELAY == TALKDELAY_NONE or not shallDelay) then
			if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
				selfSay(message, focus)
				return
			else
				selfSay(message)
				return
			end
		end

		-- TODO: Add an event handling method for delayed messages
		if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
			self.talkDelay[focus] = {
				message = message,
				time = os.time() + self.talkDelayTime,
			}
		else
			self.talkDelay = {
				message = message,
				time = os.time() + self.talkDelayTime
			}
		end
	end
end
 
Which TFS version are you using to begin with and did you replace your lib?
 
it worked, But i have this other problem.. I have a vip script and 4 items when you right click on one of these items you will get vip

The script worked before now suddenly when you press one of the items a box appears wich you can write things in.. How do i fix this? im using bronze goblet,silver goblet,gold golbet and medal of hounor.
I get this error when i press it

[22:34:17.618] [Error - Action Interface]
[22:34:17.618] data/actions/scripts/vip/vipmedal.lua:eek:nUse
[22:34:17.618] Description:
[22:34:17.618] data/lib/099-VIPf.lua:13: attempt to call field 'executeQuery' (a nil value)
[22:34:17.618] stack traceback:
[22:34:17.618] data/lib/099-VIPf.lua:13: in function 'doAddVipDays'
[22:34:17.618] data/actions/scripts/vip/vipmedal.lua:13: in function <data/actions/scripts/vip/vipmedal.lua:1>
[22:34:22.861] mysql_real_query(): SELECT `id`, `guild_id`, `enemy_id` FROM `guild_wars` WHERE (`guild_id` = 1 OR `enemy_id` = 1) AND `status` IN (1,4) - MYSQL ERROR: Table 'tfs.guild_wars' doesn't exist (1146)
 
Last edited:
Back
Top