• 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 [0.3.7] Simple crafting NPC

zbizu

Legendary OT User
Joined
Nov 22, 2010
Messages
3,323
Solutions
26
Reaction score
2,694
Location
Poland
I decided to create something like crafting system for my ot, but tile-based system had some limitations
It came to my mind that it could be created in one table and simplified, but I'm too lazy to rewrite it now.
Script is edited version of Varkhal for newer clients(if I had source I'd post it)

How does it work?
- list shows possible options(feathures RL exchanges from sweaty cyclops, djinns and mermaid)
kvq1.png


- after selecting item name NPC will ask you for required ingredients(and price if defined)
- no limitations on exchanges

Purpose of script: exchanges basically - crafting, assembling, smithing, enchanting, etc.

crafting.lua file:
Lua:
-- based on addon npc, unknown source
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

npcHandler:setMessage(MESSAGE_GREET, "Greetings |PLAYERNAME|.")

function craftItem(cid, message, keywords, parameters, node)
    if(not npcHandler:isFocused(cid)) then
        return false
    end
    if (parameters.confirm ~= true) and (parameters.decline ~= true) then
        local itemsTable = parameters.items
        local items_list = ''
        if table.maxn(itemsTable) > 0 then
            for i = 1, table.maxn(itemsTable) do
                local item = itemsTable[i]
                items_list = items_list .. item[2] .. ' ' .. getItemNameById(item[1])
                if i ~= table.maxn(itemsTable) then
                    items_list = items_list .. ', '
                end
            end
        end
        local text = ''
        if (parameters.cost > 0) and table.maxn(parameters.items) then
            text = items_list .. ' and ' .. parameters.cost .. ' gold pieces'
        elseif (parameters.cost > 0) then
            text = parameters.cost .. ' gold pieces'
        elseif table.maxn(parameters.items) then
            text = items_list
        end
        npcHandler:say('Did you bring me ' .. text .. ' for ' .. keywords[1] .. '?', cid)
        return true
    elseif (parameters.confirm == true) then
        local craftNode = node:getParent()
        local crafttable = craftNode:getParameters()
        local items_number = 0
        if table.maxn(crafttable.items) > 0 then
            for i = 1, table.maxn(crafttable.items) do
                local item = crafttable.items[i]
                if (getPlayerItemCount(cid,item[1]) >= item[2]) then
                    items_number = items_number + 1
                end
            end
        end
        if(getPlayerMoney(cid) >= crafttable.cost) and (items_number == table.maxn(crafttable.items)) then
            doPlayerRemoveMoney(cid, crafttable.cost)
            if table.maxn(crafttable.items) > 0 then
                for i = 1, table.maxn(crafttable.items) do
                    local item = crafttable.items[i]
                    doPlayerRemoveItem(cid,item[1],item[2])
                end
            end
			    for i = 1, table.maxn(crafttable.rewards) do
                    local item = crafttable.rewards[i]
                    doPlayerAddItem(cid,item[1],item[2])
                end
            npcHandler:say('Here you are.', cid)
        else
            npcHandler:say('You do not have needed items!', cid)
        end
        npcHandler:resetNpc()
        return true
    elseif (parameters.decline == true) then
        npcHandler:say('Come back when you change your mind.', cid)
        npcHandler:resetNpc()
        return true
    end
    return false
end

local noNode = KeywordNode:new({'no'}, craftItem, {decline = true})
local yesNode = KeywordNode:new({'yes'}, craftItem, {confirm = true})

-- assembling
local craft_node = keywordHandler:addKeyword({"jester doll"}, craftItem, {cost = 5000, items = {{9694,1}, {9695,1}, {9696,1}, {9697,1}, {9698,1}, {9699,1}}, rewards = {{9693,1}} })
    craft_node:addChildKeywordNode(yesNode)
    craft_node:addChildKeywordNode(noNode)
local craft_node = keywordHandler:addKeyword({"helmet of the ancients"}, craftItem, {cost = 10000, items = {{2335,1}, {2336,1}, {2337,1}, {2338,1}, {2339,1}, {2340,1}, {2341,1}}, rewards = {{2342,1}} })
    craft_node:addChildKeywordNode(yesNode)
    craft_node:addChildKeywordNode(noNode)
local craft_node = keywordHandler:addKeyword({"koshei's ancient amulet"}, craftItem, {cost = 5000, items = {{8262,1}, {8263,1}, {8264,1}, {8265,1}}, rewards = {{8266,1}} })
    craft_node:addChildKeywordNode(yesNode)
    craft_node:addChildKeywordNode(noNode)
	
-- djinn, cyclops, mermaid (melting, crafting)
local craft_node = keywordHandler:addKeyword({"fighting spirit"}, craftItem, {cost = 0, items = {{2498,2}}, rewards = {{5884,1}} })
    craft_node:addChildKeywordNode(yesNode)
    craft_node:addChildKeywordNode(noNode)
local craft_node = keywordHandler:addKeyword({"warrior's sweat"}, craftItem, {cost = 0, items = {{2475,4}}, rewards = {{5885,1}} })
    craft_node:addChildKeywordNode(yesNode)
    craft_node:addChildKeywordNode(noNode)
local craft_node = keywordHandler:addKeyword({"spool of yarn"}, craftItem, {cost = 0, items = {{5879,10}}, rewards = {{5886,1}} })
    craft_node:addChildKeywordNode(yesNode)
    craft_node:addChildKeywordNode(noNode)
local craft_node = keywordHandler:addKeyword({"enchanted chicken wing"}, craftItem, {cost = 0, items = {{2195,1}}, rewards = {{5891,1}} })
    craft_node:addChildKeywordNode(yesNode)
    craft_node:addChildKeywordNode(noNode)
local craft_node = keywordHandler:addKeyword({"royal steel"}, craftItem, {cost = 0, items = {{2487,1}}, rewards = {{5887,1}} })
    craft_node:addChildKeywordNode(yesNode)
    craft_node:addChildKeywordNode(noNode)
local craft_node = keywordHandler:addKeyword({"hell steel"}, craftItem, {cost = 0, items = {{2462,1}}, rewards = {{5888,1}} })
    craft_node:addChildKeywordNode(yesNode)
    craft_node:addChildKeywordNode(noNode)
local craft_node = keywordHandler:addKeyword({"draconian steel"}, craftItem, {cost = 0, items = {{2516,1}}, rewards = {{5889,1}} })
    craft_node:addChildKeywordNode(yesNode)
    craft_node:addChildKeywordNode(noNode)
local craft_node = keywordHandler:addKeyword({"huge chunk of crude iron"}, craftItem, {cost = 0, items = {{2393,1}}, rewards = {{5892,1}} })
    craft_node:addChildKeywordNode(yesNode)
    craft_node:addChildKeywordNode(noNode)
local craft_node = keywordHandler:addKeyword({"magic sulphur"}, craftItem, {cost = 0, items = {{2392,3}}, rewards = {{5904,1}} })
    craft_node:addChildKeywordNode(yesNode)
    craft_node:addChildKeywordNode(noNode)
	
-- smithing, enchanting
function creatureSayCallback(cid, type, msg)
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid

	if(not npcHandler:isFocused(cid)) then
		return false
	end
	
	if talkState[talkUser] == 1 then
		if (not msgcontains(msg, "yes"))then
	    npcHandler:say('Come back when you change your mind.', cid)
		talkState[talkUser] = 0
        npcHandler:resetNpc()
		else
		bolts = (getPlayerItemCount(cid,5944) * 2)
		if getPlayerItemCount(cid,5944) > 0 then
		if doPlayerRemoveItem(cid,5944,getPlayerItemCount(cid,5944)) then
			doPlayerAddItem(cid,6529,bolts)
			npcHandler:say('Here you are.', cid)
		else
			npcHandler:say("You don't have needed items!", cid) -- if orbs couldn't be removed
		end
		else
			npcHandler:say("You don't have needed items!", cid) -- if backpack is empty
		end
		talkState[talkUser] = 0
        npcHandler:resetNpc()
		end
	else
	if msgcontains(msg, "orb") or (msgcontains(msg, "infernal") and msgcontains(msg, "bolt")) then
		if (getPlayerItemCount(cid,5944) > 1) then orbs = getPlayerItemCount(cid,5944) .. " orbs" else orbs = "your soul orb" end
		bolts = (getPlayerItemCount(cid,5944) * 2)
	    if (getPlayerItemCount(cid,5944) > 0) then
		npcHandler:say('Do you want to exchange ' .. orbs .. ' for ' .. bolts .. ' infernal bolts?', cid)
		talkState[talkUser] = 1
        else
		npcHandler:say('If you bring me some soul orbs, you may exchange them for infernal bolts.', cid)
        end
	end
	if msgcontains(msg, "list") then
	craftable = {
	[1] = {"jester doll", "helmet of the ancients", "Koshei's ancient amulet"},
	[2] = {"fighting spirit", "warrior's sweat", "spool of yarn", "enchanted chicken wing", "royal steel", "hell steel", "draconian steel", "huge chunk of crude iron", "infernal bolts"},
	[3] = {"(insert your custom recipes there)"}
	}
	craftable_name = {
	[1] = "Assembling",
	[2] = "Melting, Crafting", 
	[3] = "Smithing, Enchanting"
	}
	local text = ""
	
	for i=1, #craftable do
	table.sort(craftable[i])
	local line = ""
	text = text .. line .. "    " .. craftable_name[i] .. ":\n        " .. table.concat(craftable[i], "\n        ") .. "\n\n"
    end
	npcHandler:say("Here.", cid)
	doPlayerPopupFYI(cid,"Available items:\n".. text)
	end
	end
	return true
end
keywordHandler:addKeyword({'craft'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = "Okay, just ask me for a {list} and I will show you recipes."})
keywordHandler:addKeyword({'help'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'If you want to {trade} or {craft} something just ask.'})

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
 
Last edited:
Back
Top