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

Npc problem

Elaney

Member
Joined
Jan 1, 2009
Messages
1,561
Reaction score
12
Location
Sweden
[31/12/2009 16:47:35] data/npc/lib/npc.lua:46: attempt to perform arithmetic on global 'sx' (a table value)
[31/12/2009 16:47:35] stack traceback:
[31/12/2009 16:47:35] data/npc/lib/npc.lua:46: in function 'getDistanceToCreature'
[31/12/2009 16:47:35] data/npc/scripts/oak info.lua:36: in function <data/npc/scripts/oak info.lua:33>

Anyone know what the problem could be?


here is the NPC

Lua:
local focus = 0
local talk_start = 0
local target = 0
local following = false
local attacking = false

function onThingMove(creature, thing, oldpos, oldstackpos)

end

function onCreatureAppear(creature)
end

function onCreatureDisappear(cid, pos)
	if focus == cid then
		selfSay('Good bye then.')
		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)
msg = string.lower(msg)

if (msgcontains(msg, 'hi') and (focus == 0)) and getDistanceToCreature(cid) < 4 then
selfSay('Hi '..getPlayerName(cid)..'. Before you dare facing the Demon Oak, you should talk to my brother. Last time I heard from him he had settled down in a cave in the Sultans Castle. He had managed to dig a cave below his throne. Talk to him and then come back and ask me about the DEMON OAK.')
focus = cid
talk_start = os.clock()

elseif msgcontains(msg, 'hi') and (focus ~= cid) and getDistanceToCreature(cid) < 4 then
selfSay('Sorry, ' .. creatureGetName(cid) .. '! I talk to you in a minute.')

elseif focus == cid then
talk_start = os.clock()

if msgcontains(msg, 'demon oak') then
selfSay('So, you talked to my brother? Head south from here and use the mighty axe on the Oaks arms. If you defeat him, go talk to my brother again and ask him about the DEMON OAK.')
end

if msgcontains(msg, 'bye') and getDistanceToCreature(cid) < 4 then
selfSay('Good bye, ' .. creatureGetName(cid) .. '!')
focus = 0
talk_start = 0
end
end
end


function onThink()

if (os.clock() - talk_start) > 15 then
if focus > 0 then
selfSay('Next Please...')
end
focus = 0
end
if focus ~= 0 then
if getDistanceToCreature(focus) > 2 then
selfSay('Good bye then.')
focus = 0
end
end
end
 
Last edited:
the global TFS lua function "getDistanceToCreature" is at fault here.

Apparently in its function there's a bug which causes this error.
(Tries to do +-*/ or something on a variable which contains more than one value)

What TFS version do you use, and have you touched anything in your \data\lib\ folder?
 
Code:
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

function creatureSayCallback(cid, type, msg)
	if(not npcHandler:isFocused(cid)) then
		return false
	end

	if msgcontains(msg, "demon") and msgcontains(msg, "oak") then
		npcHandler:say("So, you talked to my brother? Head south from here and use the mighty axe on the Oak's arms. If you defeat him, go talk to my brother again and ask him about the {DEMON OAK}.", cid)
	end

	return TRUE
end

npcHandler:setMessage(MESSAGE_GREET, "Hi |PLAYERNAME|. Before you dare facing the Demon Oak, you should talk to my brother. Last time I heard from him he had settled down in a cave in the Sultans Castle. He had managed to dig a cave below his throne. Talk to him and then come back and ask me about the {DEMON OAK}.")
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

o_O
 
thanks <3 :D

Lua:
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

function creatureSayCallback(cid, type, msg)
	if(not npcHandler:isFocused(cid)) then
		return false
	end
	
	function onCreatureSay(cid, type, msg)
	local player_gold = getPlayerItemCount(cid,2148)
	local player_plat = getPlayerItemCount(cid,2152)*100
	local player_crys = getPlayerItemCount(cid,2160)*10000
	local player_money = player_gold + player_plat + player_crys
	local playerCap = getPlayerFreeCap(cid)
	local item = 8293 --Hallowed Axe
	local itemweight = getItemWeight(item, 1)
	msg = string.lower(msg)
	
	

	if msgcontains(msg, "hallowed") and msgcontains(msg, "axe") then
		if getPlayerItemCount(cid,2386) >= 1 and player_money >= 1000000 then
		doPlayerTakeItem(cid,2386,1)
		doPlayerRemoveMoney(cid,1000000)
		doPlayerAddItem(cid,item,1)
		else
selfSay('Please bring with you an axe. The only way to get an axe, is to show your knowledge in the knowledge quest. Come back when you have done it and take a bunch of cash with you!')
end
end

if msgcontains(msg, 'demon oak') then
if getPlayerStorageValue(cid,21545) == 1 then
selfSay('Good job, you defeated the Demon Oak! Now search for the secret grave!')
setPlayerStorageValue(cid,21545,2)
else
selfSay('Go defeat the demon oak.')
end
end
    end 
	return TRUE
end

npcHandler:setMessage(MESSAGE_GREET, "Hi. Im the Demon Oak Monk. I can either sell you an Hallowed axe or tell you about Demon Oak.")
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

What did i do wrong there ? :( trying to learn rep added btw
 
Code:
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

function creatureSayCallback(cid, type, msg)
	if(not npcHandler:isFocused(cid)) then
		return false
	end
	local msg = msg:lower()
	if msgcontains(msg, "hallowed") and msgcontains(msg, "axe") then
		if getPlayerItemCount(cid,2386) > 0 and doPlayerRemoveMoney(cid, 1000000) == TRUE  then
			doPlayerRemoveItem(cid, 2386, 1)
			doPlayerAddItem(cid, 8293, 1)
		else
			selfSay("Please bring an axe with you. The only way to get an axe, is to show your knowledge in the knowledge quest. Come back when you have done it and take a bunch of cash with you!")
		end
	elseif msgcontains(msg, "demon") and msgcontains(msg, "oak") then
		if getPlayerStorageValue(cid, 21545) == 1 then
			selfSay("Good job, you defeated the Demon Oak! Now search for the secret grave!")
			setPlayerStorageValue(cid, 21545, 2)
		else
			selfSay("Go defeat the demon oak.")
		end
	end
	return TRUE
end

npcHandler:setMessage(MESSAGE_GREET, "Hi. Im the Demon Oak Monk. I can either sell you an  {Hallowed axe} or tell you about {Demon Oak}.")
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
 
Back
Top