Can you show how you did it?If instead doPlayerSendTextMessage I put doCreatureSay it debugs, why?
Using 8,54
Yes, should also work on TFS 1.0.Might use it on my TFS 1.0, should be possible as it works for 0.2.
Kind Regards,
Eldin.
selfSay("Thanks alot! I can finish my research now.", cid)
doPlayerAddOutfit(cid, looktype, addons)
doPlayerAddOutfitId(cid, outfitId, addons)
rewarditem = {
{id = 2160, count = 1},
{id = 2112, count = 1}
}
for r = 1, #x.rewarditem do
doPlayerAddItem(cid, x.rewarditem[r].id, x.rewarditem[r].count)
end
doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "You received "..getItemsFromTable(x.rewarditem)..".")
Lua Script Error: [Npc interface]
data/npc/scripts/itemsmissions.lua:onCreatureSay
data/npc/scripts/itemsmissions.lua:152: attempt to call global 'getItemInfo' (a
nil value)
stack traceback:
[C]: in function 'getItemInfo'
data/npc/scripts/itemsmissions.lua:152: in function 'getItemsFromTable'
data/npc/scripts/itemsmissions.lua:195: in function 'callback'
data/npc/lib/npcsystem/npchandler.lua:393: in function 'onCreatureSay'
data/npc/scripts/itemsmissions.lua:10: in function <data/npc/scripts/ite
msmissions.lua:10>
try doing it by urself, is not hard just take a look at mod&functions subforum and play with the info@Limos
Could You convert it for TFS 1.0?Code:Lua Script Error: [Npc interface] data/npc/scripts/itemsmissions.lua:onCreatureSay data/npc/scripts/itemsmissions.lua:152: attempt to call global 'getItemInfo' (a nil value) stack traceback: [C]: in function 'getItemInfo' data/npc/scripts/itemsmissions.lua:152: in function 'getItemsFromTable' data/npc/scripts/itemsmissions.lua:195: in function 'callback' data/npc/lib/npcsystem/npchandler.lua:393: in function 'onCreatureSay' data/npc/scripts/itemsmissions.lua:10: in function <data/npc/scripts/ite msmissions.lua:10>
Add this in global.lua or at the bottom of compat.lua.@Limos
Could You convert it for TFS 1.0?Code:Lua Script Error: [Npc interface] data/npc/scripts/itemsmissions.lua:onCreatureSay data/npc/scripts/itemsmissions.lua:152: attempt to call global 'getItemInfo' (a nil value) stack traceback: [C]: in function 'getItemInfo' data/npc/scripts/itemsmissions.lua:152: in function 'getItemsFromTable' data/npc/scripts/itemsmissions.lua:195: in function 'callback' data/npc/lib/npcsystem/npchandler.lua:393: in function 'onCreatureSay' data/npc/scripts/itemsmissions.lua:10: in function <data/npc/scripts/ite msmissions.lua:10>
getItemInfo = getItemDescriptions
-- Collecting items missions by Limos
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 missions = {
[1] = {items = {
{id = 5890, count = 12},
{id = 5878, count = 20},
{id = 5896, count = 15},
{id = 5902, count = 21},
{id = 5897, count = 35},
{id = 5894, count = 8}
},
message = "Wspaniale! Za kazda misje bedziesz otrzymywal ciekawe nagrody. Przynies mi:",
level = 80, -- minimum level voor this mission
rewarditem = {
{id = 8300, count = 5},
{id = 8299, count = 5}
},
rewardexp = 150000
},
[2] = {items = {
{id = 6500, count = 400},
{id = 5925, count = 50},
{id = 5922, count = 15},
{id = 6098, count = 40}
},
message = "Dzieki! Potrzebuje teraz:",
level = 100,
rewarditem = {id = 6527, count = 5},
rewardexp = 300000
},
[3] = {items = {
{id = 5909, count = 52},
{id = 5910, count = 44},
{id = 5911, count = 45},
{id = 5912, count = 48},
{id = 5913, count = 42}
},
message = "Jestes niezly, teraz potrzebne:",
level = 150,
rewarditem = {id = 6527, count = 10},
rewardexp = 450000
},
[4] = {items = {
{id = 5809, count = 3},
{id = 5884, count = 1},
{id = 5804, count = 1}
},
message = "Super! Ale to nie koniec, potrzebuje:",
level = 180,
rewarditem = {id = 6527, count = 15},
rewardexp = 700000
},
[5] = {items = {
{id = 5880, count = 100},
{id = 5895, count = 100},
{id = 5015, count = 1},
{id = 5879, count = 50},
{id = 4850, count = 1}
},
message = "Brawo jestes na serio niezly. Zostalo jeszcze kilka misji:",
level = 220,
rewarditem = {
{id = 9020, count = 2},
{id = 6527, count = 15}
},
rewardexp = 950000
},
[6] = {items = {
{id = 5906, count = 100},
{id = 5882, count = 100},
{id = 5893, count = 80},
{id = 5743, count = 60},
{id = 3967, count = 1}
},
message = "Zrobiles na mnie wrazenie. Nasze spotkania niedlugo dobiegna konca. Przynies dla mnie:",
level = 270,
rewarditem = {
{id = 9020, count = 4},
{id = 6527, count = 25}
},
rewardexp = 1450000
},
[7] = {items = {
{id = 5954, count = 100},
{id = 5919, count = 3},
{id = 5891, count = 100},
{id = 5943, count = 1}
},
message = "Nie wierzylem ze to dostane! Zostaly 3 misje!",
level = 330,
rewarditem = {
{id = 9020, count = 6},
{id = 6527, count = 55}
},
rewardexp = 1950000
},
[8] = {items = {
{id = 2151, count = 2000},
{id = 6500, count = 1000},
{id = 5808, count = 1},
{id = 2160, count = 100}
},
message = "Przeszedles samego siebie. Teraz najwazniejsze misje dla moich badan! Potrzebne:",
level = 400,
rewarditem = {
{id = 9020, count = 6},
{id = 6527, count = 85}
},
rewardexp = 2250000
},
[9] = {items = {
{id = 5903, count = 2},
{id = 15481, count = 100},
{id = 15483, count = 100},
{id = 2160, count = 500},
{id = 15486, count = 100}
},
message = "To juz moje prawie ostatnie badania, jak juz pewnie zauwazyles sa bardzo kosztowne.. Dlatego tez prosilbym Cie o silne wsparcie finansowe oraz o przyniesienie tego:",
level = 500,
rewarditem = {
{id = 9020, count = 6},
{id = 6527, count = 105}
},
rewardexp = 350000
},
[10] = {items = {
{id = 2361, count = 15},
{id = 6566, count = 3},
{id = 5944, count = 100},
{id = 2153, count = 1},
{id = 2154, count = 1},
{id = 2156, count = 1},
{id = 1970, count = 1},
{id = 2160, count = 1000},
{id = 2156, count = 1}
},
message = "W zyciu poswiecilem wszystko by to skonczyc prosze nie zawiedz mnie, zostalo mi tak niewiele.. Weteranie, przynieś mi:",
level = 600,
rewarditem = {
{id = 9020, count = 6},
{id = 6527, count = 155}
},
rewardexp = 10000000
}
}
local storage = 45550
local function getItemsFromTable(itemtable)
local text = ""
for v = 1, #itemtable do
count, info = itemtable[v].count, getItemInfo(itemtable[v].id)
local ret = ", "
if v == 1 then
ret = ""
elseif v == #itemtable then
ret = " i "
end
text = text .. ret
text = text .. (count > 1 and count or info.article).." "..(count > 1 and info.plural or info.name)
end
return text
end
function creatureSayCallback(cid, type, msg)
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
local xstorage = getPlayerStorageValue(cid, storage)
local x = missions[xstorage]
if not npcHandler:isFocused(cid) then
return false
end
if msgcontains(msg, 'misja') then
if xstorage == -1 then
selfSay("Jestem badaczem, przeprowadzam rozne eksperymenty, chcialbys dla mnie troche popracowac?", cid)
talkState[talkUser] = 1
elseif x then
if getPlayerLevel(cid) >= x.level then
selfSay("Zdobyles dla mnie {przedmioty} o ktore Cie prosilem?", cid)
talkState[talkUser] = 1
else
selfSay("Misja jest dla poziomu "..x.level..", odwiedz mnie pozniej..", cid)
end
else
selfSay("Dzieki znowu za przedmioty, duzo mi pomoga!", cid)
npcHandler:releaseFocus(cid)
end
elseif msgcontains(msg, 'tak') and talkState[talkUser] == 1 then
if xstorage == -1 then
setPlayerStorageValue(cid, storage, 1)
local x = missions[getPlayerStorageValue(cid, storage)]
selfSay(x.message.." "..getItemsFromTable(x.items)..".", cid)
elseif x then
local amount = 0
for i = 1, #x.items do
if getPlayerItemCount(cid, x.items[i].id) >= x.items[i].count then
amount = amount + 1
end
end
if amount == #x.items then
for i = 1, #x.items do
doPlayerRemoveItem(cid, x.items[i].id, x.items[i].count)
end
if x.rewarditem then
local count, info = x.rewarditem.count, getItemInfo(x.rewarditem.id)
for r = 1, #x.rewarditem do
doPlayerAddItem(cid, x.rewarditem[r].id, x.rewarditem[r].count)
end
doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "otrzymujesz: "..getItemsFromTable(x.rewarditem)..".")
end
if x.rewardexp then
doPlayerAddExp(cid, x.rewardexp)
doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "Zyskales: "..x.rewardexp.." XP.")
end
setPlayerStorageValue(cid, storage, xstorage + 1)
local x = missions[getPlayerStorageValue(cid, storage)]
if x then
selfSay(x.message.." "..getItemsFromTable(x.items)..".", cid)
else
selfSay("Dziekuje Ci za wszystko przyjacielu, dzieki Tobie zakonczylem swoje badania!", cid)
end
else
local n = 0
for i = 1, #x.items do
if getPlayerItemCount(cid, x.items[i].id) < x.items[i].count then
n = n + 1
end
end
local text = ""
local c = 0
for v = 1, #x.items do
count, info = x.items[v].count - getPlayerItemCount(cid, x.items[v].id), getItemInfo(x.items[v].id)
if getPlayerItemCount(cid, x.items[v].id) < x.items[v].count then
c = c + 1
local ret = ", "
if c == 1 then
ret = ""
elseif c == n then
ret = " and "
end
text = text .. ret
text = text .. (count > 1 and count or info.article).." "..(count > 1 and info.plural or info.name)
end
end
selfSay("Nie masz przedmiotow.. Miales zebrac: "..text..".", cid)
end
end
talkState[talkUser] = 0
elseif msgcontains(msg, 'items') and x then
selfSay("Przedmioty o które pytalem to: "..getItemsFromTable(x.items)..".", cid)
elseif msgcontains(msg, 'no') and talkState[talkUser] == 1 then
selfSay("Ja Cie do niczego nie zmusze...", cid)
end
return true
end
npcHandler:setMessage(MESSAGE_FAREWELL, "Zegnaj!")
npcHandler:setMessage(MESSAGE_WALKAWAY, "A dowidzenia? Tak myslalem... Brudasie...")
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
local count, info = x.rewarditem.count, getItemInfo(x.rewarditem.id)
00:15 Mitrox: Thanks again for all your items, it helped me alot.Tested with TFS 0.3.6pl1 8.54 and TFS 0.2.14 9.6
Mitrox.xml
Code:<?xml version="1.0" encoding="UTF-8"?> <npc name="Mitrox" script="itemsmissions.lua" walkinterval="2000" floorchange="0"> <health now="100" max="100"/> <look type="130" head="57" body="114" legs="95" feet="119" addons="0"/> <parameters> <parameter key="message_greet" value="Hello |PLAYERNAME|."/> </parameters> </npc>
itemsmissions.lua
Code:-- Collecting items missions by Limos 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 missions = { [1] = {items = { {id = 5890, count = 12}, {id = 5878, count = 20}, {id = 5896, count = 15}, {id = 5902, count = 21}, {id = 5897, count = 35}, {id = 5894, count = 8} }, message = "Great, I need alot of items, but you can start with", level = 15, -- minimum level voor this mission rewarditem = {id = 2160, count = 1}, rewardexp = 15000 }, [2] = {items = { {id = 5898, count = 20}, {id = 5921, count = 28}, {id = 5899, count = 15}, {id = 5905, count = 25}, {id = 6097, count = 35}, {id = 6098, count = 26} }, message = "Thank you, the next items are", level = 30, rewarditem = {id = 2160, count = 5}, rewardexp = 40000 }, [3] = {items = { {id = 5920, count = 45}, {id = 5879, count = 30}, {id = 5881, count = 15}, {id = 5876, count = 18}, {id = 5877, count = 22} }, message = "Awesome, now get", level = 50, rewarditem = {id = 2160, count = 15}, rewardexp = 100000 }, [4] = {items = { {id = 5913, count = 20}, {id = 5909, count = 42}, {id = 5914, count = 38}, {id = 5911, count = 25}, {id = 5912, count = 10}, {id = 5910, count = 10} }, message = "Thanks, now I need", level = 70, rewarditem = {id = 2160, count = 25}, rewardexp = 200000 }, [5] = {items = { {id = 5906, count = 35}, {id = 5882, count = 42}, {id = 5893, count = 28}, {id = 5948, count = 32}, {id = 5954, count = 22}, {id = 4850, count = 1} }, message = "Good, only a few items left,", level = 100, rewarditem = {id = 2160, count = 50}, rewardexp = 450000 } } local storage = 45550 local function getItemsFromTable(itemtable) local text = "" for v = 1, #itemtable do count, info = itemtable[v].count, getItemInfo(itemtable[v].id) local ret = ", " if v == 1 then ret = "" elseif v == #itemtable then ret = " and " end text = text .. ret text = text .. (count > 1 and count or info.article).." "..(count > 1 and info.plural or info.name) end return text end function creatureSayCallback(cid, type, msg) local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid local xstorage = getPlayerStorageValue(cid, storage) local x = missions[xstorage] if not npcHandler:isFocused(cid) then return false end if msgcontains(msg, 'mission') then if xstorage == -1 then selfSay("I am a scientist and I am currently doing some research, do you think you can help me out?", cid) talkState[talkUser] = 1 elseif x then if getPlayerLevel(cid) >= x.level then selfSay("Did you get the {items} I asked you?", cid) talkState[talkUser] = 1 else selfSay("The mission I gave you is for level "..x.level..", come back later.", cid) end else selfSay("Thanks again for all your items, it helped me alot.", cid) npcHandler:releaseFocus(cid) end elseif msgcontains(msg, 'yes') and talkState[talkUser] == 1 then if xstorage == -1 then setPlayerStorageValue(cid, storage, 1) local x = missions[getPlayerStorageValue(cid, storage)] selfSay(x.message.." "..getItemsFromTable(x.items)..".", cid) elseif x then local amount = 0 for i = 1, #x.items do if getPlayerItemCount(cid, x.items[i].id) >= x.items[i].count then amount = amount + 1 end end if amount == #x.items then for i = 1, #x.items do doPlayerRemoveItem(cid, x.items[i].id, x.items[i].count) end if x.rewarditem then local count, info = x.rewarditem.count, getItemInfo(x.rewarditem.id) doPlayerAddItem(cid, x.rewarditem.id, count) doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "You received "..(count > 1 and count or info.article).." "..(count > 1 and info.plural or info.name)..".") end if x.rewardexp then doPlayerAddExp(cid, x.rewardexp) doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "You received "..x.rewardexp.." experience.") end setPlayerStorageValue(cid, storage, xstorage + 1) local x = missions[getPlayerStorageValue(cid, storage)] if x then selfSay(x.message.." "..getItemsFromTable(x.items)..".", cid) else selfSay("Thanks alot! I can finish my research now.", cid) end else local n = 0 for i = 1, #x.items do if getPlayerItemCount(cid, x.items[i].id) < x.items[i].count then n = n + 1 end end local text = "" local c = 0 for v = 1, #x.items do count, info = x.items[v].count - getPlayerItemCount(cid, x.items[v].id), getItemInfo(x.items[v].id) if getPlayerItemCount(cid, x.items[v].id) < x.items[v].count then c = c + 1 local ret = ", " if c == 1 then ret = "" elseif c == n then ret = " and " end text = text .. ret text = text .. (count > 1 and count or info.article).." "..(count > 1 and info.plural or info.name) end end selfSay("You don't have all items, you still need to get "..text..".", cid) end end talkState[talkUser] = 0 elseif msgcontains(msg, 'items') and x then selfSay("The items I asked you are "..getItemsFromTable(x.items)..".", cid) elseif msgcontains(msg, 'no') and talkState[talkUser] == 1 then selfSay("Oh well, I guess not then.", cid) end return true end npcHandler:setMessage(MESSAGE_FAREWELL, "Bye!") npcHandler:setMessage(MESSAGE_WALKAWAY, "Bye? I guess...") npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())
You can remove those lines if you don't want a rewarditem or exp for a certain mission.
Code:rewarditem = {id = 2160, count = 1} rewardexp = 15000
How does it work:
The NPC gives missions to collect items, it will start with the first mission.
If you don't have all items, the NPC will tell you which items are still missing.
If you want to know the items from your current mission, you can ask what they are by saying items.
If you have all the items the NPC asked, the items will be removed, you will get the reward and the NPC will give you the next mission.
If you finished the last mission the NPC will thank you, give you the reward of the last mission, remove the items and then it's done.
The amount of missions, items, level, rewards and the storage are as example, you can change this in local missions and local storage.
If you use TFS 0.2 (Mystic Spirit), change script="itemsmissions.lua" to script="data/npc/scripts/itemsmissions.lua" and add this in global.lua.
Code:getItemInfo = getItemDescriptions
Report bugs.
Also feel free to give suggestions or to ask questions.