• 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 that allows you to trade after answering a question - Anti refiller!

kito2

www.masteria.net
Joined
Mar 9, 2009
Messages
3,764
Solutions
1
Reaction score
227
Location
Chile, Santiago
Hi, I have a NPC (runes.lua - the one which comes with TFS distro) that sell you pots and runes by trade or buy/sell words...

I want to f*ck all refilers and have the following idea:

Player: hi
NPC: Hi, you want to trade? Then answer how many is 15 + 4 - 2.
Player: trade
NPC: Sorry, you can't trade if you don't answer how many is 15 + 4 -2.
Player: 17
NPC: Ok, you can trade now.

I will rep++ and also pay 10 USD for this fix!
 
idk how to do that but why not make a wall w/ a switch before it. when u stand on the switch a msg pops up to the player what is 5+10-3. if they answer correctly they get TP'd past the wall to were the npc is, from there they can talk to the npc.
 
if its for bots i think that you can make a script for read numbers and symbols and make the operations, but i think that i will be advanced script so you will kill a lot of botters ;)
 
Doubt it will work, but I tried! :p

Code:
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)

local Topic = {}
local numbers = math.random(1, 20)
local answer

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(msgcontains(msg, "hello") or msgcontains(msg, "hi")) and (not npcHandler:isFocused(cid)) then
		npcHandler:say("Hello " .. getCreatureName(cid) .. ". What does " .. numbers .. " + " .. numbers .. " equal?", cid)
		Topic[cid] = 1
		answer = (numbers + numbers)
		npcHandler:addFocus(cid)
	elseif(not npcHandler:isFocused(cid)) then
		return false
	elseif Topic[cid] == 1 then
		if msgcontains(msg, answer) then
			npcHandler:say("Correct! Now ask me for a {trade}.", cid)
			doSendMagicEffect(getThingPos(cid), CONST_ME_MAGIC_BLUE)
			Topic[cid] = 2
		else
			npcHandler:say("Sorry, your answer was incorrect. Better luck next time!", cid)
			Topic[cid] = nil
			npcHandler:releaseFocus(cid)
		end
	elseif Topic[cid] == 2 then
		if msgcontains(msg, "trade") or msgcontains(msg, "offer") then
			doSendMagicEffect(getThingPos(cid), CONST_ME_MAGIC_RED)
			npcHandler:say("Here are my offers!", cid)
			Topic[cid] = nil
		else
			npcHandler:say("Sorry, I didn't understand you. Do you want a {trade}?", cid)
			Topic[cid] = 2
		end
	elseif msgcontains(msg, "bye") or msgcontains(msg, "farewell") and npcHandler:isFocused(cid) then
		npcHandler:say("Good bye.", cid, TRUE)
		Topic[cid] = nil
		npcHandler:releaseFocus(cid)
	end

	return true
end

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:setMessage(MESSAGE_WALKAWAY, "How Rude!")
 
It works very nice, but it always says 18 + 18, and when you say trade, no items... The items should be a random from 50 and 50, and where to add the items?

LUA:
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({'magic lightwand'}, 2161, 400, 'magic lightwand')

shopModule:addBuyableItem({'small health'}, 8704, 15, 1, 'small health potion')
shopModule:addBuyableItem({'health potion'}, 7618, 20, 1, 'health potion')
shopModule:addBuyableItem({'mana potion'}, 7620, 20, 1, 'mana potion')
shopModule:addBuyableItem({'strong health'}, 7588, 30, 1, 'strong health potion')
shopModule:addBuyableItem({'strong mana'}, 7589, 40, 1, 'strong mana potion')
shopModule:addBuyableItem({'great health'}, 7591, 80, 1, 'great health potion')
shopModule:addBuyableItem({'great mana'}, 7590, 80, 1, 'great mana potion')
shopModule:addBuyableItem({'great spirit'}, 8472, 90, 1, 'great spirit potion')
shopModule:addBuyableItem({'ultimate health'}, 8473, 200, 1, 'ultimate health potion')
shopModule:addBuyableItem({'antidote potion'}, 8474, 35, 1, 'antidote potion')

shopModule:addSellableItem({'normal potion flask', 'normal flask'}, 7636, 5, 'empty small potion flask')
shopModule:addSellableItem({'strong potion flask', 'strong flask'}, 7634, 1, 'empty strong potion flask')
shopModule:addSellableItem({'great potion flask', 'great flask'}, 7635, 15, 'empty great potion flask')


shopModule:addBuyableItem({'animate dead'}, 2316, 150, 1, 'animate dead rune')
shopModule:addBuyableItem({'wild growth'}, 2269, 80, 1, 'wild growth rune')
shopModule:addBuyableItem({'magic wall'}, 2293, 60, 1, 'magic wall rune')
shopModule:addBuyableItem({'stalagmite'}, 2292, 60, 1, 'stalagmite rune')
shopModule:addBuyableItem({'poison wall'}, 2289, 110, 1, 'poison wall rune')
shopModule:addBuyableItem({'poison field'}, 2285, 35, 1, 'poison field rune')
shopModule:addBuyableItem({'fire wall'}, 2303, 105, 1, 'fire wall rune')
shopModule:addBuyableItem({'fire field'}, 2301, 45, 1, 'fire field rune')
shopModule:addBuyableItem({'fire bomb'}, 2305, 95, 1, 'fire bomb rune')
shopModule:addBuyableItem({'energy wall'}, 2279, 130, 1, 'energy wall rune')
shopModule:addBuyableItem({'energy field rune'}, 2277, 65, 1, 'energy field rune')
shopModule:addBuyableItem({'blank rune'}, 2260, 10, 1, 'blank rune')
shopModule:addBuyableItem({'avalanche'}, 2274, 35, 1, 'avalanche rune')
shopModule:addBuyableItem({'instense healing'}, 2265, 45, 1, 'intense healing rune')
shopModule:addBuyableItem({'ultimate healing'}, 2273, 60, 1, 'ultimate healing rune')
shopModule:addBuyableItem({'destroy field'}, 2261, 25, 1, 'destroy field rune')
shopModule:addBuyableItem({'light magic missile'}, 2287, 20, 1, 'light magic missile rune')
shopModule:addBuyableItem({'heavy magic missile'}, 2311, 40, 1, 'heavy magic missile rune')
shopModule:addBuyableItem({'great fireball'}, 2304, 50, 4, 'great fireball rune')
shopModule:addBuyableItem({'explosion'}, 2313, 50, 1, 'explosion rune')
shopModule:addBuyableItem({'sudden death'}, 2268, 100, 1, 'sudden death rune')
shopModule:addBuyableItem({'paralyze'}, 2278, 180, 1, 'paralyze rune')
shopModule:addBuyableItem({'convince creature'}, 2290, 25, 1, 'convince creature rune')
shopModule:addBuyableItem({'chameleon'}, 2291, 65, 1, 'chameleon rune')
shopModule:addBuyableItem({'desintegrate'}, 2310, 25,  1, 'desintegreate rune')


shopModule:addBuyableItem({'wand of vortex', 'vortex'}, 2190, 500, 1, 'wand of vortex')
shopModule:addBuyableItem({'wand of dragonbreath', 'dragonbreath'}, 2191, 1000, 1, 'wand of dragonbreath')
shopModule:addBuyableItem({'wand of decay', 'decay'}, 2188, 5000, 1, 'wand of decay')
shopModule:addBuyableItem({'wand of draconia', 'draconia'}, 8921, 7500, 1, 'wand of draconia')
shopModule:addBuyableItem({'wand of cosmic energy', 'cosmic energy'}, 2189, 10000, 1, 'wand of cosmic energy')
shopModule:addBuyableItem({'wand of inferno', 'inferno'}, 2187, 15000, 1, 'wand of inferno')
shopModule:addBuyableItem({'wand of starstorm', 'starstorm'}, 8920, 18000, 1, 'wand of starstorm')
shopModule:addBuyableItem({'wand of voodoo', 'voodoo'}, 8922, 22000, 1, 'wand of voodoo')

shopModule:addBuyableItem({'snakebite rod', 'snakebite'}, 2182, 500, 1, 'snakebite rod')
shopModule:addBuyableItem({'moonlight rod', 'moonlight'}, 2186, 1000, 1, 'moonlight rod')
shopModule:addBuyableItem({'necrotic rod', 'necrotic'}, 2185, 5000, 1, 'necrotic rod')
shopModule:addBuyableItem({'northwind rod', 'northwind'}, 8911, 7500, 1, 'northwind rod')
shopModule:addBuyableItem({'terra rod', 'terra'}, 2181, 10000, 1, 'terra rod')
shopModule:addBuyableItem({'hailstorm rod', 'hailstorm'}, 2183, 15000, 1, 'hailstorm rod')
shopModule:addBuyableItem({'springsprout rod', 'springsprout'}, 8912, 18000, 1, 'springsprout rod')
shopModule:addBuyableItem({'underworld rod', 'underworld'}, 8910, 22000, 1, 'underworld rod')

local items = {[1] = 2190, [2] = 2182, [5] = 2190, [6] = 2182}
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, 'first rod') or msgcontains(msg, 'first wand')) then
		if(isSorcerer(cid) or isDruid(cid)) then
			if(getPlayerStorageValue(cid, 30002) <= 0) then
				selfSay('So you ask me for a {' .. getItemNameById(items[getPlayerVocation(cid)]) .. '} to begin your advanture?', cid)
				talkState[talkUser] = 1
			else
				selfSay('What? I have already gave you one {' .. getItemNameById(items[getPlayerVocation(cid)]) .. '}!', cid)
			end
		else
			selfSay('Sorry, you aren\'t a druid either a sorcerer.', cid)
		end
	elseif(msgcontains(msg, 'yes')) then
		if(talkState[talkUser] == 1) then
			doPlayerAddItem(cid, items[getPlayerVocation(cid)], 1)
			selfSay('Here you are young adept, take care yourself.', cid)
			setPlayerStorageValue(cid, 30002, 1)
		end
		talkState[talkUser] = 0
	elseif(msgcontains(msg, 'no') and isInArray({1}, talkState[talkUser])) then
		selfSay('Ok then.', cid)
		talkState[talkUser] = 0
	end

	return true
end

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
 
You should add the items in the XML part, so when you say trade, they are there.

Same numbers fixed.
Code:
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)

local Topic = {}
local number_1 = math.random(1, 20)
local number_2 = math.random(1, 20)
local answer

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(msgcontains(msg, "hello") or msgcontains(msg, "hi")) and (not npcHandler:isFocused(cid)) then
		npcHandler:say("Hello " .. getCreatureName(cid) .. ". What does " .. number_1 .. " + " .. number_2 .. " equal?", cid)
		Topic[cid] = 1
		answer = (number_1 + number_2)
		npcHandler:addFocus(cid)
	elseif(not npcHandler:isFocused(cid)) then
		return false
	elseif Topic[cid] == 1 then
		if msgcontains(msg, answer) then
			npcHandler:say("Correct! Now ask me for a {trade}.", cid)
			doSendMagicEffect(getThingPos(cid), CONST_ME_MAGIC_BLUE)
			Topic[cid] = 2
		else
			npcHandler:say("Sorry, your answer was incorrect. Better luck next time!", cid)
			Topic[cid] = nil
			npcHandler:releaseFocus(cid)
		end
	elseif Topic[cid] == 2 then
		if msgcontains(msg, "trade") or msgcontains(msg, "offer") then
			doSendMagicEffect(getThingPos(cid), CONST_ME_MAGIC_RED)
			npcHandler:say("Here are my offers!", cid)
			Topic[cid] = nil
		else
			npcHandler:say("Sorry, I didn't understand you. Do you want a {trade}?", cid)
			Topic[cid] = 2
		end
	elseif msgcontains(msg, "bye") or msgcontains(msg, "farewell") and npcHandler:isFocused(cid) then
		npcHandler:say("Good bye.", cid, TRUE)
		Topic[cid] = nil
		npcHandler:releaseFocus(cid)
	end

	return true
end

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:setMessage(MESSAGE_WALKAWAY, "How Rude!")
 
Back
Top