• 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!

Lua 3 IFs to this system

luccagomes

New Member
Joined
Jul 30, 2015
Messages
153
Reaction score
1
I need help to make a npc
3 if's to check:
if player not started the task
if player is doing (not finish, but started)
if player finish the task

Using this task system
Code:
<?xml version="1.0" encoding="UTF-8"?>  
<mod name="Simple Task" version="3.0" author="Vodkart" contact="xtibia.com" enabled="yes">  
<config name="task_func"><![CDATA[

tasktabble = {
   ["bandits guild"] = {monster_race={"bandit","wild warrior","smuggler"}, storage_start = 200202, storage = 91002,count = 1},
   ["rotworm"] = {monster_race={"rotworm"}, storage_start = 200203, storage = 91003,count = 100},
   ["carrion worm"] = {monster_race={"carrion worm"}, storage_start = 200204, storage = 91004,count = 100},
   ["rotworm queen"] = {monster_race={"rotworm queen"}, storage_start = 200205, storage = 91005,count = 10},
}


configbosses_task = {
{race = "minotaur",Playerpos = {x = 189, y = 57, z = 7}, FromPosToPos = {{x = 186, y = 54, z = 7},{x = 193, y = 60, z = 7}},time = 5},
{race = "necromancer",Playerpos = {x = 196, y = 39, z = 7}, FromPosToPos = {{x = 195, y = 37, z = 7},{x = 198, y = 41, z = 7}}, time = 5},
{race = "dragon",Playerpos = {x = 208, y = 59, z = 7}, FromPosToPos = {{x = 206, y = 56, z = 7},{x = 209, y = 65, z = 7}}, time = 5}
}

function CheckTask(cid)
for k, v in pairs(tasktabble) do
if getPlayerStorageValue(cid,v.storage_start) >= 1 then return true end
end
return false
end
function finisheAllTask(cid)
local config = {
exp = {true,100000},
money = {true,200000},
items ={false,{{2124,2},{2173,1}}},
premium ={true,5}
}
local x = true
for k, v in pairs(tasktabble) do
if tonumber(getPlayerStorageValue(cid,v.storage)) then
x = false
end
end
if x == true then
setPlayerStorageValue(cid, 521456, 0)
local b = getGlobalStorageValue(63005) if b == -1 then b = 1 end
if b < 11 then
setGlobalStorageValue(63005,b+1)
doBroadcastMessage('[Task Mission Complete] '..getCreatureName(cid)..' was the '..b..' to finish the task!.')
doPlayerAddPremiumDays(cid, config.premium[1] == true and config.premium[2] or 0)
doPlayerAddExp(cid, config.exp[1] == true and config.exp[2] or 0)
doPlayerAddMoney(cid, config.money[1] == true and config.money[2] or 0)
if config.items[1] == true then doAddItemsFromList(cid,config.items[2]) end
doItemSetAttribute(doPlayerAddItem(cid, 7369), "name", "trophy "..getCreatureName(cid).." completed all the task.")
end
end
end
function HavePlayerPosition(cid, from, to)
   return isInRange(getPlayerPosition(cid), from, to) and true or false
end
function getRankStorage(cid, value, max, RankName) -- by vodka
local str =""
str = "--[".. (RankName == nil and "RANK STORAGE" or ""..RankName.."") .."]--\n\n"
local query = db.getResult("SELECT `player_id`, `value` FROM `player_storage` WHERE `key` = "..value.." ORDER BY cast(value as INTEGER) DESC;")
if (query:getID() ~= -1) then k = 1 repeat if k > max then break end
str = str .. "\n " .. k .. ". "..getPlayerNameByGUID(query:getDataString("player_id")).." - [" .. query:getDataInt("value") .. "]"
k = k + 1 until not query:next() end return doShowTextDialog(cid, 2529, str)
end
function getItemsInContainerById(container, itemid) -- Function By Kydrai
       local items = {}
       if isContainer(container) and getContainerSize(container) > 0 then
               for slot=0, (getContainerSize(container)-1) do
                       local item = getContainerItem(container, slot)
                       if isContainer(item.uid) then
                               local itemsbag = getItemsInContainerById(item.uid, itemid)
                               for i=0, #itemsbag do
                                       table.insert(items, itemsbag[i])
                               end
                       else
                               if itemid == item.itemid then
                                       table.insert(items, item.uid)
                               end
                       end
               end
       end
       return items
end
function doPlayerAddItemStacking(cid, itemid, quant) -- by mkalo
   local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)
   local piles = 0
   if #item > 0 then
       for i,x in pairs(item) do
           if getThing(x).type < 100 then
               local it = getThing(x)
               doTransformItem(it.uid, itemid, it.type+quant)
               if it.type+quant > 100 then
                   doPlayerAddItem(cid, itemid, it.type+quant-100)
               end
           else
              piles = piles+1
           end
       end
   else
       return doPlayerAddItem(cid, itemid, quant)
   end
   if piles == #item then
       doPlayerAddItem(cid, itemid, quant)
   end
end
function getItemsFromList(items) -- by vodka
local str = ''
if table.maxn(items) > 0 then
for i = 1, table.maxn(items) do
str = str .. items[i][2] .. ' ' .. getItemNameById(items[i][1])
if i ~= table.maxn(items) then str = str .. ', ' end end end
return str
end
function doAddItemsFromList(cid,items) -- by vodka
if table.maxn(items) > 0 then
for i = 1, table.maxn(items) do
local count = items[i][2]
while count > 0 do
if isItemStackable(items[i][1]) then
doPlayerAddItemStacking(cid, items[i][1], 1)
else
doPlayerAddItem(cid, items[i][1],1)
end
count = count - 1
end
end
end
end
     function pairsByKeys(t, f)
      local a = {}
      for n in pairs(t) do table.insert(a, n) end
      table.sort(a, f)
      local i = 0
      local iter = function ()
         i = i + 1
         if a[i] == nil then return nil
         else return a[i], t[a[i]]
         end
      end
      return iter
     end
]]></config>
<event type="login" name="TaskLogin" event="script"><![CDATA[
function onLogin(cid)
registerCreatureEvent(cid, "KillTask")
return true
end]]></event>
<talkaction words="/task;!task" event="buffer"><![CDATA[
domodlib('task_func')
local param = string.lower(param)
if param == "rank" then
getRankStorage(cid, 521456, 20, "Task Rank Finalizadas") return true
end
local str = ""
str = str .. "Task Completed :\n\n"
for k, v in pairsByKeys(tasktabble) do
local contagem = getPlayerStorageValue(cid, v.storage)
if (contagem == -1) then contagem = 1 end
str = str..k.." = ".. (not tonumber(contagem) and "["..contagem.."]" or "["..((contagem)-1).."/"..v.count.."]") .."\n"
end
str = str .. ""
return doShowTextDialog(cid, 8983, str)
]]></talkaction>   
<event type="kill" name="KillTask" event="script"><![CDATA[
domodlib('task_func')
function onKill(cid, target, lastHit)
if(isMonster(target) == true) then
local n = string.lower(getCreatureName(target))
for race, mob in pairs(tasktabble) do
if getPlayerStorageValue(cid,mob .storage_start) >= 1 then
for i = 1,#mob.monster_race do
if n == mob.monster_race[i] then
local contagem = getPlayerStorageValue(cid, mob.storage)
if (contagem == -1) then contagem = 1 end
if not tonumber(contagem) then return true end
if contagem > mob.count then return true end
if contagem > mob.count then return true end
setPlayerStorageValue(cid, mob.storage, contagem+1)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,""..(contagem == mob.count and "Congratulations! You finished the task of "..race.."." or "defeated. Total [" .. contagem .. "/" .. mob.count .. "] " .. race .. ".").."")
end
end
end
end
end
return true
end]]></event>
</mod>
 
You are halfway there
if then else

I know how to do a if ... My problem is understand this script to set storages values

if getCreatureStorage(cid, started) >= 1 then
if getCreatureStorage(cid, doing) >= 1 then
if getCreatureStorage(cid, finished) >= 1 then

Or something like that /\

This script is advanced and im a aprendice
 
I know how to do a if ... My problem is understand this script to set storages values
This script is not advanced, its bulky but not advanced.

The functions in every distro are designed and labeled so that they make sense and you have a general idea of what they do.

If you look at the script you will see a function called, getPlayerStorageValue, if we break up the word using the capitalized letters to determine the next word you see: get Player Storage Value.

Now that we have an idea of what this function does, what does it really do?
It requests to get the storage value of a storage that may or may not be assigned to the player.. it does not say hey.. i want to set the storage value of a storage for a player now does it?

Luckily for us there is a function that does set the storage value of a storage that will be assigned to the player.. can you guess what its called?

setPlayerStorageValue...

Both these functions have 2 of the same parameters the 1st parameter they share is usually labeled cid, what is cid? I am glad you asked.. cid is normally used to point to a creature, player or npc and nothing else.

The 2nd parameter of these 2 functions share is normally labeled storage.. guess what that holds?

setPlayerStorageValue is the only function of the 2 that has a 3rd parameter usually labeled value, this parameter is the value that will be set for whatever storage value is in the 2nd parameter.

Think of it like this, instead of using a word variable to store data
e.g.
Code:
local variable = 1
You can think of it like this
Code:
123456 = 1
To summarize..
Code:
getPlayerStorageValue(cid, storage) -- returns the storage value of a storage assigned to the player
setPlayerStorageValue(cid, storage, value) -- sets the storage value of a storage that will be assigned to a player

See that wasn't so hard now was it?
 
Last edited:
This script is not advanced, its bulky but not advanced.

The functions in every distro are designed and labeled so that they make sense and you have a general idea of what they do.

If you look at the script you will see a function called, getPlayerStorageValue, if we break up the word using the capitalized letters to determine the next word you see: get Player Storage Value.

Now that we have an idea of what this function does, what does it really do?
It requests to get the storage value of a storage that may or may not be assigned to the player.. it does not say hey.. i want to set the storage value of a storage for a player now does it?

Luckily for us there is a function that does set the storage value of a storage that will be assigned to the player.. can you guess what its called?

setPlayerStorageValue...

Both these functions have 2 of the same parameters the 1st parameter they share is usually labeled cid, what is cid? I am glad you asked.. cid is normally used to point to a creature, player or npc and nothing else.

The 2nd parameter of these 2 functions share is normally labeled storage.. guess what that holds?

setPlayerStorageValue is the only function of the 2 that has a 3rd parameter usually labeled value, this parameter is the value that will be set for whatever storage value is in the 2nd parameter.

Think of it like this, instead of using a word variable to store data
e.g.
Code:
local variable = 1
You can think of it like this
Code:
123456 = 1
To summarize..
Code:
getPlayerStorageValue(cid, storage) -- returns the storage value of a storage assigned to the player
setPlayerStorageValue(cid, storage, value) -- sets the storage value of a storage that will be assigned to a player

See that wasn't so hard now was it?

Ty, but

I read it in other forum man, i know how storages work, but
This code is confused for me

You could make me doubt?

storage_start = if this value >= 1, then player started or doing the task
storage = if this value >= 1, then player have killed all monster and finished the task

Im right?
 
Meager tutorial incoming.
Hope it helps.
Code:
--[[
< less then
> greater then
== equal to
<= less then or equal to
>= greater then or equal to
~= does not equal to
]]

--[[
all storage start at -1 by default.
General rule of thumb..
-1 = value untouched
0 = value started
1 = value finished
]]

local storage = 45001

     if getCreatureStorage(cid, storage) < 0 then
         -- start quest

     elseif getCreatureStorage(cid, storage) == 0 then
         -- you have already started the quest

     -- option 1, for a quest that is not continuing.  
     elseif getCreatureStorage(cid, storage) == 1 then
         -- you have completed my quest!

     -- option 2, for a quest that has more missions,
     -- or continues onto another npc, et cetera
     elseif getCreatureStorage(cid, storage) >= 1 then
         -- you have completed my quest!

     end
 
Back
Top