• 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!
  • 2026 staff recruitment is open! Check it out and consider applying!

TFS 1.X+ How to improve this code

Lopaskurwa

Well-Known Member
Joined
Oct 6, 2017
Messages
936
Solutions
2
Reaction score
57
Anyone got any optimization improvements this is Rekzais party module.
creaturescript
LUA:
local OPCODE_PARTY = 160

function onThink(creature, interval)
    -- only players have parties
    if not creature:isPlayer() then
        return true
    end

    local party = creature:getParty()
    if not party then
        return true
    end

    local pos = creature:getPosition()
    local _data = {
        name = creature:getName(),
        pos = {x = pos.x, y = pos.y, z = pos.z}
    }

    -- send update to all members + leader
    local leader = party:getLeader()
    if leader then
        leader:sendExtendedOpcode(OPCODE_PARTY, json.encode({type = "update", player = _data}))
    end
    for _, member in ipairs(party:getMembers()) do
        member:sendExtendedOpcode(OPCODE_PARTY, json.encode({type = "update", player = _data}))
    end

    return true
end
party.lua
LUA:
local OPCODE_PARTY = 160

function Party:onJoin(player)
     addEvent(function() Arena:onPartySizeChange(self) end, 1) -- Fix since we want to know what the new party looks like (after joining)

    -- PARTY ICON START
    -- scuffed workaround because members only get populated after we returned true :/
    local _members = {}
    local leader = self:getLeader()

    table.insert(_members, {name = player:getName(), vocation = player:getVocation():getClientId(), pos = player:getPosition()})
    for _, member in ipairs(self:getMembers()) do
        table.insert(members, {name = member:getName(), vocation = member:getVocation():getClientId(), pos = member:getPosition()})
    end
    table.insert(_members, {name = leader:getName(), vocation = leader:getVocation():getClientId(), pos = leader:getPosition()})

    player:sendExtendedOpcode(OPCODE_PARTY, json.encode({type = "join", members = _members}))
    leader:sendExtendedOpcode(OPCODE_PARTY, json.encode({type = "join", members = _members}))

    for _, member in ipairs(self:getMembers()) do
        member:sendExtendedOpcode(OPCODE_PARTY, json.encode({type = "join", members = _members}))
    end

    player:registerEvent("partyUpdate")

    if #self:getMembers() == 0 then
        leader:registerEvent("partyUpdate")
    end
    -- PARTY ICON END
     return true
 end

function Party:onLeave(player)
    Arena:onPartySizeChange(self)

    -- PARTY ICON START
    local members = self:getMembers()

    for _, member in ipairs(members) do
        member:sendExtendedOpcode(OPCODE_PARTY, json.encode({type = "leave", name = player:getName()}))
    end
    self:getLeader():sendExtendedOpcode(OPCODE_PARTY, json.encode({type = "leave", name = player:getName()}))

    player:unregisterEvent("partyUpdate")
    -- PARTY ICON END
    return true
end

function Party:onDisband()
    -- PARTY ICON START
    local members = self:getMembers()

    for _, member in ipairs(members) do
        member:sendExtendedOpcode(OPCODE_PARTY, json.encode({type = "leave", name = member:getName()}))
        member:unregisterEvent("partyUpdate")
    end
    self:getLeader():sendExtendedOpcode(OPCODE_PARTY, json.encode({type = "leave", name = self:getLeader():getName()}))
    self:getLeader():unregisterEvent("partyUpdate")
    -- PARTY ICON END
    return true
end
 
creaturescript.lua
LUA:
local OPCODE_PARTY = 160

function onThink(creature, interval)
    if not creature:isPlayer() then
        return true
    end

    local party = creature:getParty()
    if not party then
        return true
    end

    local pos = creature:getPosition()
    local jsonData = json.encode({
        type = "update",
        player = {
            name = creature:getName(),
            pos = {
                x = pos.x,
                y = pos.y,
                z = pos.z
            }
        }
    })

    local members = party:getMembers()
    local leader = party:getLeader()
    if leader then
        local isLeaderInMembers = false
        for _, member in ipairs(members) do
            if member:getId() == leader:getId() then
                isLeaderInMembers = true
                break
            end
        end
        if not isLeaderInMembers then
            table.insert(members, leader)
        end
    end

    for _, member in ipairs(members) do
        member:sendExtendedOpcode(OPCODE_PARTY, jsonData)
    end

    return true
end

party.lua
LUA:
local OPCODE_PARTY = 160

function Party:onJoin(player)
    addEvent(function() Arena:onPartySizeChange(self) end, 1)

    local membersData = {}
    local leader = self:getLeader()

    table.insert(membersData, {
        name = player:getName(),
        vocation = player:getVocation():getClientId(),
        pos = player:getPosition()
    })

    table.insert(membersData, {
        name = leader:getName(),
        vocation = leader:getVocation():getClientId(),
        pos = leader:getPosition()
    })
 
    for _, member in ipairs(self:getMembers()) do
        table.insert(membersData, {
            name = member:getName(),
            vocation = member:getVocation():getClientId(),
            pos = member:getPosition()
        })
    end

    local jsonData = json.encode({
        type = "join",
        members = membersData
    })

    local allPartyMembers = self:getMembers()
    for _, member in ipairs(allPartyMembers) do
        member:sendExtendedOpcode(OPCODE_PARTY, jsonData)
    end
    if leader and #self:getMembers() > 0 and leader:getId() ~= player:getId() then
        leader:sendExtendedOpcode(OPCODE_PARTY, jsonData)
    end
    player:registerEvent("partyUpdate")

    if #self:getMembers() == 0 then
        leader:registerEvent("partyUpdate")
    end
    return true
end

function Party:onLeave(player)
    Arena:onPartySizeChange(self)

    local jsonData = json.encode({
        type = "leave",
        name = player:getName()
    })

    local members = self:getMembers()
    local leader = self:getLeader()
    if leader then
        leader:sendExtendedOpcode(OPCODE_PARTY, jsonData)
    end
    for _, member in ipairs(members) do
        member:sendExtendedOpcode(OPCODE_PARTY, jsonData)
    end

    player:unregisterEvent("partyUpdate")
    return true
end

This should pre calculate JSON and do less looping.
 
creaturescript.lua
LUA:
local OPCODE_PARTY = 160

function onThink(creature, interval)
    if not creature:isPlayer() then
        return true
    end

    local party = creature:getParty()
    if not party then
        return true
    end

    local pos = creature:getPosition()
    local jsonData = json.encode({
        type = "update",
        player = {
            name = creature:getName(),
            pos = {
                x = pos.x,
                y = pos.y,
                z = pos.z
            }
        }
    })

    local members = party:getMembers()
    local leader = party:getLeader()
    if leader then
        local isLeaderInMembers = false
        for _, member in ipairs(members) do
            if member:getId() == leader:getId() then
                isLeaderInMembers = true
                break
            end
        end
        if not isLeaderInMembers then
            table.insert(members, leader)
        end
    end

    for _, member in ipairs(members) do
        member:sendExtendedOpcode(OPCODE_PARTY, jsonData)
    end

    return true
end

party.lua
LUA:
local OPCODE_PARTY = 160

function Party:onJoin(player)
    addEvent(function() Arena:onPartySizeChange(self) end, 1)

    local membersData = {}
    local leader = self:getLeader()

    table.insert(membersData, {
        name = player:getName(),
        vocation = player:getVocation():getClientId(),
        pos = player:getPosition()
    })

    table.insert(membersData, {
        name = leader:getName(),
        vocation = leader:getVocation():getClientId(),
        pos = leader:getPosition()
    })
 
    for _, member in ipairs(self:getMembers()) do
        table.insert(membersData, {
            name = member:getName(),
            vocation = member:getVocation():getClientId(),
            pos = member:getPosition()
        })
    end

    local jsonData = json.encode({
        type = "join",
        members = membersData
    })

    local allPartyMembers = self:getMembers()
    for _, member in ipairs(allPartyMembers) do
        member:sendExtendedOpcode(OPCODE_PARTY, jsonData)
    end
    if leader and #self:getMembers() > 0 and leader:getId() ~= player:getId() then
        leader:sendExtendedOpcode(OPCODE_PARTY, jsonData)
    end
    player:registerEvent("partyUpdate")

    if #self:getMembers() == 0 then
        leader:registerEvent("partyUpdate")
    end
    return true
end

function Party:onLeave(player)
    Arena:onPartySizeChange(self)

    local jsonData = json.encode({
        type = "leave",
        name = player:getName()
    })

    local members = self:getMembers()
    local leader = self:getLeader()
    if leader then
        leader:sendExtendedOpcode(OPCODE_PARTY, jsonData)
    end
    for _, member in ipairs(members) do
        member:sendExtendedOpcode(OPCODE_PARTY, jsonData)
    end

    player:unregisterEvent("partyUpdate")
    return true
end

This should pre calculate JSON and do less looping.
With this update code doesnt work, shows nothing at all on the minimap but no errors aswell
 
Back
Top