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

TASK in Party (Tfs 1.2).

APTGET

New Member
Joined
Dec 29, 2020
Messages
37
Reaction score
3
I'm trying to get players in one part to be able to share the same task. Even if it is via Target (if the player is in the target, it counts). I have tried something like:

- Creaturescript tasks.lua

Lua:
local config = {
    ["crocodile"] = {count = 100, storage = 1001, start = 1, plural = "crocodiles"},

    ["dwarf"] = {count = 200, storage = 1002, start = 1, plural = "dwarves"},
    ["dwarf soldier"] = {count = 200, storage = 1002, start = 1, plural = "dwarves"},
}

function onKill(player, target, lastHit, isParty)
    local monster = config[target:getName():lower()]
    local members = getPartyMembers(player)
    local validTaskT = {}
    if not monster or target:getMaster() then
    if isPlayer(target) then return true end
        return true
    end
    if not isSummon(target) then
            if not members then
            else
                if lastHit then
                    checkPlayerOnScreen(player, members, validTaskT)
                        for i, validTaskMembers in ipairs(validTaskT) do
                            taskFunctions(validTaskMembers, target, true)
                        end
                end
            end
    end

    local storageValue = player:getStorageValue(monster.storage)
    if storageValue >= monster.start then
        if storageValue >= monster.count then
            player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You have already killed " .. monster.count .. " " .. monster.plural .. ". Report back to Tusker in Thais.")
        else
            player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You have killed [" .. storageValue .. "/" .. monster.count .. "] " .. monster.plural .. ".")
        end
            player:setStorageValue(monster.storage, storageValue + 1)
    end
    return true
end

function checkPlayerOnScreen(player, membersT, validTaskT)
    local rangeX, rangeY = 7, 7
    local spectators = getSpectators(getCreaturePosition(player), rangeX, rangeY, false)
        if spectators then
            for _, spectator in ipairs(spectators) do
                    if isPlayer(spectator) then
                        for __, member in ipairs(membersT) do
                            if member == spectator then
                                table.insert(validTaskT, member)
                            end
                        end
                    end
            end
        end
end


I'm using the nostalrius 7.72 server for the tests. Below I am leaving Tusker.srv (npc) and gen-tasks.ndb (script) I tried to merge the original code with another one, but obviously I am VERY LOST. Can anyone help me with this?

I just need to be able to do group tasks.



----------------------------------------------------------------------------------------
Here is the script from which I got some parts:

Code:
function onKill(cid, target, lastHit)
    local members = getPartyMembers(cid)
    local validTaskT = {}
  
    if not isSummon(target) then
            if not members then
                taskFunctions(cid, target, false)
            else
                if lastHit then
                    checkPlayerOnScreen(cid, members, validTaskT)
                        for i, validTaskMembers in ipairs(validTaskT) do
                            taskFunctions(validTaskMembers, target, true)
                        end
                end
            end
    end

    return true
end

function taskFunctions(value, target, isParty)
    local started = getPlayerStartedTasks(value)
    if isPlayer(target) then return true end
        if started and #started > 0 then
            for _, id in ipairs(started) do
                if isInArray(tasks[id].creatures, getCreatureName(target):lower()) then
                    if getPlayerStorageValue(value, KILLSSTORAGE_BASE + id) < 0 then
                    setPlayerStorageValue(value, KILLSSTORAGE_BASE + id, 0)
                    end
                    if getPlayerStorageValue(value, KILLSSTORAGE_BASE + id) < tasks[id].killsRequired then
                    setPlayerStorageValue(value, KILLSSTORAGE_BASE + id, getPlayerStorageValue(value, KILLSSTORAGE_BASE + id) + 1)
                    doPlayerSendTextMessage(value, MESSAGE_STATUS_CONSOLE_ORANGE, getPlayerStorageValue(value, KILLSSTORAGE_BASE + id) .. "/" .. tasks[id].killsRequired .. " " .. tasks[id].raceName .. " already killed.")
                    end
                end
            end
        end
end

function checkPlayerOnScreen(cid, membersT, validTaskT)
    local rangeX, rangeY = 7, 7
    local spectators = getSpectators(getCreaturePosition(cid), rangeX, rangeY, false)
        if spectators then
            for _, spectator in ipairs(spectators) do
                    if isPlayer(spectator) then
                        for __, member in ipairs(membersT) do
                            if member == spectator then
                                table.insert(validTaskT, member)
                            end
                        end
                    end
            end
        end
end


Tusker.srv (npc) and gen-tasks.ndb (script)
 

Attachments

A mod will move it. I would help but im a little confused with what you are doing.

Got it. Thanks. Then I will wait for them to move. I'm sorry for that again.

--------
I'm trying to get players to share party tasks. I want to encourage group hunting, and that's one way.

If the players play in a party, tell the mission to everyone.
Or if the player is partying, and shareexp is active, a mission for everyone.

I would be happy with either option. As long as you can do Task in Party missions.
 
Ive been trying to solve this by myself aswell for a good while so Id really appreciate something like this.

This was my last attempt:
Lua:
local config = {
     ['minotaur'] = {amount = 300, storage = 921777, startstorage = 921677, startvalue = 1}
}
function onKill(player, target, killer, mostDamageKiller)
     local monster = config[target:getName():lower()]
     if target:isPlayer() or not monster or target:getMaster() then
         return true
     end

--PARTY STUFF     
    local party = player:getParty()
    local membersList = {}   
    
    if party then
        -- Insert Members
        membersList = party:getMembers()
        -- Insert Leader
        table.insert(membersList, party:getLeader())
    end
    -- Check collate all members and add to valid target list if in range
    local affectedList = {}
    for _, partyMember in ipairs(membersList) do
        local partyMemberId = partyMember:getId()
        local partyMemberName = partyMember:getName()
        if partyMemberId ~= player:getId() then
          table.insert(affectedList, partyMember)   
        else
          return false           
        end
    end

    -- local stor = player:getStorageValue(monster.storage)+1
        --Party Counting
        for _, partyMember in ipairs(affectedList) do
        local partyMemberId = partyMember:getId()
            if party:isSharedExperienceEnabled() == true and partyMember:getStorageValue(monster.storage)+1 < monster.amount and partyMember:getStorageValue(monster.startstorage) >= monster.startvalue then               
                partyMember:setStorageValue(monster.storage, partyMember:getStorageValue(monster.storage)+1)       
                partyMember:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, 'Status:  '..(partyMember:getStorageValue(monster.storage) +1)..' of '..monster.amount..'  are killed. (PARTY PLAYER).')               
            end   
        end

    --Party Quest End
    for _, partyMember in ipairs(affectedList) do
    local stor = partyMember:getStorageValue(monster.storage)+1
        if party:isSharedExperienceEnabled() == true and (stor +1) == monster.amount then
        --Observer
            partyMember:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, 'Status: You have killed '..monster.amount..' minotaurs. Return to NPC for your reward.')
            partyMember:setStorageValue(monster.storage, stor)
            partyMember:setStorageValue(monster.storage, stor +1)               
        end   
    end       
--//PARTY STUFF//   
 


     return true
end

It was a while ago since I played with it, I think it works but if I recall correctly the issue I ran into was the player who counted as killer got storage 2 times for one kill
 
Last edited:
Ive been trying to solve this by myself aswell for a good while so Id really appreciate something like this.

This was my last attempt:
Lua:
local config = {
     ['minotaur'] = {amount = 300, storage = 921777, startstorage = 921677, startvalue = 1}
}
function onKill(player, target, killer, mostDamageKiller)
     local monster = config[target:getName():lower()]
     if target:isPlayer() or not monster or target:getMaster() then
         return true
     end

--PARTY STUFF    
    local party = player:getParty()
    local membersList = {}  
   
    if party then
        -- Insert Members
        membersList = party:getMembers()
        -- Insert Leader
        table.insert(membersList, party:getLeader())
    end
    -- Check collate all members and add to valid target list if in range
    local affectedList = {}
    for _, partyMember in ipairs(membersList) do
        local partyMemberId = partyMember:getId()
        local partyMemberName = partyMember:getName()
        if partyMemberId ~= player:getId() then
          table.insert(affectedList, partyMember)  
        else
          return false          
        end
    end

    -- local stor = player:getStorageValue(monster.storage)+1
        --Party Counting
        for _, partyMember in ipairs(affectedList) do
        local partyMemberId = partyMember:getId()
            if party:isSharedExperienceEnabled() == true and partyMember:getStorageValue(monster.storage)+1 < monster.amount and partyMember:getStorageValue(monster.startstorage) >= monster.startvalue then              
                partyMember:setStorageValue(monster.storage, partyMember:getStorageValue(monster.storage)+1)      
                partyMember:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, 'Status:  '..(partyMember:getStorageValue(monster.storage) +1)..' of '..monster.amount..'  are killed. (PARTY PLAYER).')              
            end  
        end

    --Party Quest End
    for _, partyMember in ipairs(affectedList) do
    local stor = partyMember:getStorageValue(monster.storage)+1
        if party:isSharedExperienceEnabled() == true and (stor +1) == monster.amount then
        --Observer
            partyMember:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, 'Status: You have killed '..monster.amount..' minotaurs. Return to NPC for your reward.')
            partyMember:setStorageValue(monster.storage, stor)
            partyMember:setStorageValue(monster.storage, stor +1)              
        end  
    end      
--//PARTY STUFF//  



     return true
end

It was a while ago since I played with it, I think it works but if I recall correctly the issue I ran into was the player who counted as killer got storage 2 times for one kill

Oh. Nice. Thanks for sharing!

I tried so much just to get your script and use it, as to adapt it, but even so, from the moment I recharge Creaturescript, it doesn't contain a task, either in parties or solo. That is, it does not work, and there is not even an error on the console.


My original script in use is this:

Lua:
["rat"] = {count = 50, storage = 1054, start = 1, plural = "rats"},
}

function onKill(player, target)
    local monster = config[target:getName():lower()]
    if not monster or target:getMaster() then
        return true
    end

    local storageValue = player:getStorageValue(monster.storage)
    if storageValue >= monster.start then
        if storageValue >= monster.count then
            player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You have already killed " .. monster.count .. " " .. monster.plural .. ". Report back to Tusker in Thais.")
        else
            player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You have killed [" .. storageValue .. "/" .. monster.count .. "] " .. monster.plural .. ".")
        end
            player:setStorageValue(monster.storage, storageValue + 1)
    end
    return true
end
 
Oh. Nice. Thanks for sharing!

I tried so much just to get your script and use it, as to adapt it, but even so, from the moment I recharge Creaturescript, it doesn't contain a task, either in parties or solo. That is, it does not work, and there is not even an error on the console.


My original script in use is this:

Lua:
["rat"] = {count = 50, storage = 1054, start = 1, plural = "rats"},
}

function onKill(player, target)
    local monster = config[target:getName():lower()]
    if not monster or target:getMaster() then
        return true
    end

    local storageValue = player:getStorageValue(monster.storage)
    if storageValue >= monster.start then
        if storageValue >= monster.count then
            player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You have already killed " .. monster.count .. " " .. monster.plural .. ". Report back to Tusker in Thais.")
        else
            player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You have killed [" .. storageValue .. "/" .. monster.count .. "] " .. monster.plural .. ".")
        end
            player:setStorageValue(monster.storage, storageValue + 1)
    end
    return true
end
It's probably erroring on start-up, since you didn't copy your config table fully
 
Back
Top