TFS 0.2/1.0 system.lua
Tested with TFS 0.2.13, TFS 0.2.14, TFS 0.2.15 and TFS 1.0
I've been posting this script already since 2012, but since there is still a huge amount of support threads about it I decided to make a thread.
All credits go to the maker of the TFS 0.3 system.lua, I only edited it to make it work for TFS 0.2/1.0, fixed some bugs and added that people get a different textmessage when the item is to heavy or when they don't have enough space.
All credits go to the maker of the TFS 0.3 system.lua, I only edited it to make it work for TFS 0.2/1.0, fixed some bugs and added that people get a different textmessage when the item is to heavy or when they don't have enough space.
How does it work:
This is the questsytem script from TFS 0.3/0.4 where you have to add actionid 2000, an uniqueid for the storage and the items in the chest.
If players use the chest, they will get the items you added in the chest one time with a message which items they got, after that they will get a message that it's empty.
http://otland.net/f479/how-quests-148708/
actions.xml
Code:
<action actionid="2000" script="quests/system.lua"/>
system.lua
Code:
local specialQuests = {
[2001] = 30015 --Annihilator
}
local questsExperience = {
[30015] = 10000
}
function onUse(cid, item, fromPosition, itemEx, toPosition)
local storage = specialQuests[item.actionid]
if(not storage) then
storage = item.uid
if(storage > 65535) then
return false
end
end
if(getPlayerStorageValue(cid, storage) > 0) then
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "It is empty.")
return true
end
local items = {}
local reward = 0
local size = isContainer(item.uid) and getContainerSize(item.uid) or 0
if(size == 0) then
reward = doCopyItem(item, false)
else
for i = 0, size do
local tmp = getContainerItem(item.uid, i)
if(tmp.itemid > 0) then
table.insert(items, tmp)
end
end
end
size = table.maxn(items)
if(size == 1) then
reward = doCopyItem(items[1], true)
end
local result = ""
if(reward ~= 0) then
local ret = getItemDescriptions(reward.itemid)
if(reward.type > 0 and isItemRune(reward.itemid)) then
result = reward.type .. " charges " .. ret.name
elseif(reward.type > 0 and isItemStackable(reward.itemid)) then
result = reward.type .. " " .. ret.plural
else
result = ret.article .. " " .. ret.name
end
else
if(size > 20) then
reward = doCopyItem(item, false)
elseif(size > 8) then
reward = getThing(doCreateItemEx(1988, 1))
else
reward = getThing(doCreateItemEx(1987, 1))
end
for i = 1, size do
local tmp = doCopyItem(items[i], true)
if(doAddContainerItemEx(reward.uid, tmp.uid) ~= RETURNVALUE_NOERROR) then
print("[Warning] QuestSystem:", "Could not add quest reward")
else
local ret = ", "
if(i == 1) then
ret = ""
elseif(i == size) then
ret = " and "
end
result = result .. ret
ret = getItemDescriptions(tmp.itemid)
if(tmp.type > 0 and isItemRune(tmp.itemid)) then
result = result .. tmp.type .. " charges " .. ret.name
elseif(tmp.type > 0 and isItemStackable(tmp.itemid)) then
result = result .. tmp.type .. " " .. ret.plural
else
result = result .. ret.article .. " " .. ret.name
end
end
end
end
if getPlayerFreeCap(cid) < getItemWeightByUID(reward.uid) then
result = "You have found a reward weighing "..getItemWeightByUID(reward.uid).." oz. It is to heavy."
elseif(doPlayerAddItemEx(cid, reward.uid, false) ~= RETURNVALUE_NOERROR) then
result = "You have found a reward, but you don't have enough space."
else
result = "You have found " .. result .. "."
setPlayerStorageValue(cid, storage, 1)
if(questsExperience[storage] ~= nil) then
doPlayerAddExp(cid, questsExperience[storage])
end
end
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, result)
return true
end
Also remove this if you want to use those chests for the system.lua
Code:
<action itemid="1740" script="quests/quests.lua"/>
<action fromid="1747" toid="1749" script="quests/quests.lua"/>
If you use TFS 1.0, add this in global.lua
Code:
function doCopyItem(item, attributes)
local attributes = attributes or false
local ret = doCreateItemEx(item.itemid, item.type)
if(attributes) then
if(item.actionid > 0) then
doSetItemActionId(ret, item.actionid)
end
end
if(isContainer(item.uid) == TRUE) then
for i = (getContainerSize(item.uid) - 1), 0, -1 do
local tmp = getContainerItem(item.uid, i)
if(tmp.itemid > 0) then
doAddContainerItemEx(ret, doCopyItem(tmp, true).uid)
end
end
end
return getThing(ret)
end
Last edited: