Skip to content

Instantly share code, notes, and snippets.

@UchihaClan
Created March 21, 2015 22:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save UchihaClan/e84825ec6a4ab8864241 to your computer and use it in GitHub Desktop.
Save UchihaClan/e84825ec6a4ab8864241 to your computer and use it in GitHub Desktop.
-- Collecting items and monster 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 = 5894, count = 8}
},
message = "Great, for your first mission you need to collect some items, I need",
level = 15, -- minimum level voor this mission
rewarditems = {
{id = 2160, count = 1},
{id = 2152, count = 1}
},
rewardexp = 15000
},
[2] = {
monsters = {
{name = "Rat", count = 20, storage = 31200},
{name = "Rotworm", count = 26, storage = 31202)
},
message = "Thanks, for your next mission kill",
level = 30,
rewarditems = {
{id = 2160, count = 5}
},
rewardexp = 40000
},
[3] = {
items = {
{id = 5920, count = 45},
{id = 5877, count = 22}
},
message = "Awesome, now get",
level = 50,
rewarditems = {
{id = 2160, count = 15}
},
rewardexp = 100000
},
[4] = {
monsters = {
{name = "Dragon Lords", count = 2, storage = 31204},
setPlayerStorageValue(cid, storage, -1)
},
message = "Good job, now kill",
level = 70,
rewarditems = {
{id = 2160, count = 25}
},
rewardexp = 200000
},
[5] = {
items = {
{id = 5906, count = 35},
{id = 5882, count = 42},
{id = 4850, count = 1}
},
message = "Good, now your final mission, there are a few more items you need to get,",
level = 100,
rewarditems = {
{id = 2160, count = 50}
},
rewardexp = 450000
}
}
local storage = 45555
local function getItemsMonstersFromTable(imtable)
local text = ""
for v = 1, #imtable do
local ret = ", "
if v == 1 then
ret = ""
elseif v == #imtable then
ret = " and "
end
text = text .. ret
count = imtable[v].count
if imtable[v].id then
info = getItemInfo(imtable[v].id)
text = text .. (count > 1 and count or info.article).." "..(count > 1 and info.plural or info.name)
else
text = text .. count .." "..imtable[v].name
end
end
return text
end
function creatureSayCallback(cid, type, msg)
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
if not npcHandler:isFocused(cid) then
return false
end
local x = missions[getPlayerStorageValue(cid, storage)]
if msgcontains(msg, 'mission') or msgcontains(msg, 'quest') then
if not exhaustion.check(cid, 45690) and getPlayerStorageValue(cid, storage) > 0 then
setPlayerStorageValue(cid, storage, -1)
xstorage = getPlayerStorageValue(cid, storage)
end
if getPlayerStorageValue(cid, storage) == -1 then
selfSay("I have several missions for you, do you accept the challenge?", cid)
talkState[talkUser] = 1
elseif x then
if getPlayerLevel(cid) >= x.level then
local mess = x.items and "get "..getItemssFromTable(x.items) or "kill "..getItemsMonstersFromTable(x.monsters)
selfSay("Did you "..mess.."?", cid)
talkState[talkUser] = 1
else
selfSay("The mission I gave you is for level "..x.level..", come back later.", cid)
end
else
selfSay("You already did all the missions, great job though.", cid)
exhaustion.set(cid, 45690, 86400)
npcHandler:releaseFocus(cid)
end
elseif msgcontains(msg, 'yes') and talkState[talkUser] == 1 then
if getPlayerStorageValue(cid, storage) == -1 then
setPlayerStorageValue(cid, storage, 1)
local x = missions[getPlayerStorageValue(cid, storage)]
local imtable = x.items or x.monsters
selfSay(x.message.." "..getItemsMonstersFromTable(imtable)..".", cid)
setPlayerStorageValue(cid, storage, -1)
exhaustion.set(cid, 45690, 86400)
elseif x then
local imtable = x.items or x.monsters
local amount = 0
for it = 1, #imtable do
local check = x.items and getPlayerItemCount(cid, imtable[it].id) or getPlayerStorageValue(cid, imtable[it].storage)
if check >= imtable[it].count then
amount = amount + 1
end
end
if amount == #imtable then
if x.items then
for it = 1, #x.items do
doPlayerRemoveItem(cid, x.items[it].id, x.items[it].count)
end
end
if x.rewarditems then
for r = 1, #x.rewarditems do
doPlayerAddItem(cid, x.rewarditems[r].id, x.rewarditems[r].count)
end
doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "You received "..getItemsMonstersFromTable(x.rewarditems)..".")
end
if x.rewardexp then
doPlayerAddExp(cid, x.rewardexp)
doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "You received "..x.rewardexp.." experience.")
end
setPlayerStorageValue(cid, storage, getPlayerStorageValue(cid, storage) + 1)
local x = missions[getPlayerStorageValue(cid, storage)]
if x then
selfSay(x.message.." "..getItemsMonstersFromTable(x.items or x.monsters)..".", cid)
else
selfSay("Well done! You did a great job on all your missions.", cid)
end
else
local n = 0
for i = 1, #imtable do
local check = x.items and getPlayerItemCount(cid, imtable[i].id) or getPlayerStorageValue(cid, imtable[i].storage)
if check < imtable[i].count then
n = n + 1
end
end
local text = ""
local c = 0
for v = 1, #imtable do
local check = x.items and getPlayerItemCount(cid, imtable[v].id) or getPlayerStorageValue(cid, imtable[v].storage)
if check < imtable[v].count then
c = c + 1
local ret = ", "
if c == 1 then
ret = ""
elseif c == n then
ret = " and "
end
text = text .. ret
if x.items then
local count, info = imtable[v].count - getPlayerItemCount(cid, imtable[v].id), getItemInfo(imtable[v].id)
text = text .. (count > 1 and count or info.article).." "..(count > 1 and info.plural or info.name)
else
local count = imtable[v].count - (getPlayerStorageValue(cid, imtable[v].storage) + 1)
text = text .. count.." "..imtable[v].name
end
end
end
selfSay(x.items and "You don't have all items, you still need to get "..text.."." or "You didn't kill all monsters, you still need to kill "..text..".", cid)
end
end
talkState[talkUser] = 0
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, "Good bye, have a nice day!")
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment