Ir para conteúdo

Posts Recomendados

Dei uma editada la... pra evitar o floodar mais deu na mesma :\

 

[Warning - Event::checkScript] Can not load script: scripts/reward_chest.lua
data/creaturescripts/scripts/reward_chest.lua:248: <eof> expected near 'end'
Editado por GlobalCores
Link para o comentário
Compartilhar em outros sites

Erro meu.

 

Coloque:

REWARD_CHEST = {
    BOSSES = {"Bibby Bloodbath", "Chizzoron the Distorter", "Ferumbras",
            "Furyosa", "Gaz'haragoth", "Ghazbaran", "Hirintror",
            "Jaul", "Mad Mage", "Mawhawk", "Morgaroth", "Obujos",
            "Ocyakao", "Omrafir", "Orshabaal", "Raging Mage",
            "Tanjis", "The Mutated Pumpkin", "The Pale Count",
            "The Welter", "Tyrn", "White Pale", "Zulazza the Corruptor",
            "Zushuka"},
    LOOT = {},     
    DECAY = {},
    DEPOT_ID = 99,
    CONTAINER = 21518,
    EXPIRE = 7*24*60*60,     --days to erase stored rewards
    STORAGE = 18394,         --player storage for chest exhaustion
    EXHAUST = 5*60,         --time allowed to use again the chest
}

function table.find(t, value, sensitive)
    local sensitive = sensitive or true
    if(not sensitive and type(value) == 'string') then
        for i, v in pairs(t) do
            if(type(v) == 'string') then
                if(v:lower() == value:lower()) then
                    return i
                end
            end
        end
        return nil
    end
    for i, v in pairs(t) do
        if(v == value) then
            return i
        end
    end
    return nil
end

function table.serialize(x, recur)
    local t = type(x)
    recur = recur or {}
    if(t == nil) then
        return "nil"
    elseif(t == "string") then
        return string.format("%q", x)
    elseif(t == "number") then
        return tostring(x)
    elseif(t == "boolean") then
        return x and "true" or "false"
    elseif(getmetatable(x)) then
        error("Can not serialize a table that has a metatable associated with it.")
    elseif(t == "table") then
        if(table.find(recur, x)) then
            error("Can not serialize recursive tables.")
        end
        table.insert(recur, x)
        local s = "{"
        for k, v in pairs(x) do
            s = s .. "[" .. table.serialize(k, recur) .. "]" .. " = " .. table.serialize(v, recur) .. ", "
        end
        return s:sub(0, s:len() - 2) .. "}"
    end
    error("Can not serialize value of type '" .. t .. "'.")
end

function table.unserialize(str)
    return loadstring('return ' .. str)()
end

function addContainerItems(container, items)
    for k, v in pairs(items) do
        if ItemType(k):isContainer() then
            local newBag = Container(doCreateItemEx(k, 1))
            addContainerItems(newBag, v)
            container:addItemEx(newBag)
        else
            container:addItem(v[1], v[2])
        end
    end
end

function MonsterType.createLootItem(self, lootBlock, chance)
    local lootTable, itemCount = {}, 0
    local randvalue = math.random(0, 100000) / (getConfigInfo("rateLoot") * chance)
    if randvalue < lootBlock.chance then
        if (ItemType(lootBlock.itemId):isStackable()) then
            itemCount = randvalue % lootBlock.maxCount + 1
        else
            itemCount = 1
        end
    end

    while itemCount > 0 do
        local n = math.min(itemCount, 100)
        itemCount = itemCount - n
        table.insert(lootTable, {lootBlock.itemId, n})
    end

    return lootTable
end

function MonsterType.getBossReward(self, chance)
    local result = {}
    if getConfigInfo("rateLoot") > 0 then
        for _, loot in pairs(self:getLoot()) do
            local itemList = self:createLootItem(loot, chance)
            if itemList then
                for _, item in ipairs(itemList) do
                    table.insert(result, item)
                end
            end
        end
    end
    return result
end

function getDecayTime(id)
    local decayTime = 0
    do
        local o = io.open('data/items/items.xml','r')
        file = o:read('*a')
        o:close()
    end
    local function sumDecayTime(corpse)
        for attr in file:gmatch('<item.-id="' .. corpse ..'"(.-)</item>') do
            local decayTo = attr:match('<attribute.-key="decayTo".-value="(.-)".-/>')
            local duration = attr:match('<attribute.-key="duration".-value="(.-)".-/>')
            decayTime = decayTime + duration
            if tonumber(decayTo) > 0 then
                sumDecayTime(decayTo)
            end
            break
        end
    end
    sumDecayTime(id)
    return decayTime
end

function loadCorpses()
    for _, name in ipairs(REWARD_CHEST.BOSSES) do
        if MonsterType(name) ~= nil then
            REWARD_CHEST.DECAY[name] = getDecayTime(MonsterType(name):getCorpseId())
        end
    end
end
addEvent(loadCorpses, 0)

function getPlayerByGUID(guid)
    for _, player in ipairs(Game.getPlayers()) do
        if guid == player:getGuid() then
            return player
        end
    end
    return nil
end

function Player.addReward(self, reward, time, id)
    local LootBag = Container(doCreateItemEx(REWARD_CHEST.CONTAINER, 1))
    LootBag:setAttribute('text', time)
    addContainerItems(LootBag, reward)
    if id then
        db.query('DELETE FROM player_rewardchest WHERE id = ' .. id .. ';')
    end
    return self:getDepotChest(REWARD_CHEST.DEPOT_ID, true):addItemEx(LootBag)
end

function doSaveReward(uid, name)
    for GUID, items in pairs(REWARD_CHEST.LOOT[uid]) do
        local player = getPlayerByGUID(GUID)
        if player ~= nil then
            player:addReward(items, os.time())
            player:sendTextMessage(MESSAGE_INFO_DESCR, 'Your reward container from ' .. name .. ' was moved to your reward chest.')
        else
            db.query('INSERT INTO player_rewardchest VALUES (NULL, ' .. GUID ..', "' .. table.serialize(items) ..'", ' .. os.time() ..');')
        end
    end
    REWARD_CHEST.LOOT[uid] = nil
end

function Player.updateRewardChest(self)
    db.query('DELETE FROM player_rewardchest WHERE TIME_TO_SEC(TIMEDIFF(NOW(), FROM_UNIXTIME(date))) >= '.. REWARD_CHEST.EXPIRE ..';')
    local Query = db.storeQuery('SELECT id, reward, date FROM player_rewardchest WHERE player_id = '.. self:getGuid() ..';')
    if Query ~= false then
        repeat
            local rewardBag = table.unserialize(result.getDataString(Query, 'reward'))
            self:addReward(rewardBag, result.getDataInt(Query, 'date'), result.getDataInt(Query, 'id'))
        until not result.next(Query)
        result.free(Query)
    end
    local depotChest = self:getDepotChest(REWARD_CHEST.DEPOT_ID, true)
    for index = (depotChest:getSize() - 1), 0, -1 do
       local container = depotChest:getItem(index)
       if (container:getAttribute('text') ~= nil) and (tonumber(container:getAttribute('text')) + REWARD_CHEST.EXPIRE < os.time()) then
          container:remove()
       end
    end
    return self:setExhaustion(REWARD_CHEST.STORAGE, REWARD_CHEST.EXHAUST)
end

function string.diff(self)
    local format = {
        {'day', self / 60 / 60 / 24},
        {'hour', self / 60 / 60 % 24},
        {'minute', self / 60 % 60},
        {'second', self % 60}
    }

    local out = {}
    for k, t in ipairs(format) do
        local v = math.floor(t[2])
        if(v > 0) then
            table.insert(out, (k < #format and (#out > 0 and ', ' or '') or ' and ') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or ''))
        end
    end
    local ret = table.concat(out)
    if ret:len() < 16 and ret:find('second') then
        local a, b = ret:find(' and ')
        ret = ret:sub(b+1)
    end
    return ret
end

function doBossReward(monster, corpse)
    REWARD_CHEST.LOOT[corpse:getUniqueId()] = {}
    corpse:setAttribute('aid', 21584)
    corpse:setAttribute('text', corpse:getUniqueId())
    for killer, damage in pairs(monster:getDamageMap()) do
        local player, str = Player(killer), 'Loot of ' .. MonsterType(monster:getName()):getNameDescription() .. ': '
        if player ~= nil then
            local rewardBag = doCreateItemEx(REWARD_CHEST.CONTAINER)
            if player:getStamina() > 840 then
                local loot = MonsterType(monster:getName()):getBossReward(damage.total/monster:getMaxHealth())
                if #loot > 0 then
                    addContainerItems(Container(rewardBag), loot)
                    REWARD_CHEST.LOOT[corpse:getUniqueId()][player:getGuid()] = loot
                    str = str .. Container(rewardBag):getContentDescription()
                else
                    str = str .. 'nothing'
                end
            else
                str = str .. 'nothing (due to low stamina)'
            end
            player:sendTextMessage(MESSAGE_INFO_DESCR, str .. '.')
        end
    end
    addEvent(doSaveReward, REWARD_CHEST.DECAY[monster:getName()]*1000, corpse:getUniqueId(), MonsterType(monster:getName()):getNameDescription())
end
    end
end
Link para o comentário
Compartilhar em outros sites

O erro ainda continua.

[Warning - Event::checkScript] Can not load script: scripts/reward_chest.lua
data/creaturescripts/scripts/reward_chest.lua:247: <eof> expected near 'end'
Ta faltando algum end em algum lugar kkkk quando é pequeno eu identifico rápido mais esse ai é cheio de end
Mesmo nao funcionando deveria mostrar o Bau no dp? ou so depois que mata o boss?
Editado por GlobalCores
Link para o comentário
Compartilhar em outros sites

Tira os dois últimos ends.

 

Quando dei reload apareceu isso

[Warning - Event::checkScript] Event onKill not found. scripts/reward_chest.lua

Acho que não tem:

function onKill(cid, target)
Link para o comentário
Compartilhar em outros sites

Na verdade esse sistema ainda não está funcionando como deveria...(similar ao global)

 

Referente ao que estão dizendo aqui,

Vou dar uma olhada e ver o que tem de errada no tópico.

Link para o comentário
Compartilhar em outros sites

  • 2 weeks later...

 

Que codes? para adicionar nas sources? eu adicionei e compilei e deu certo, como que é o certo então?

 

Os codes são os códigos que colocamos na source.

Esse reward está totalmente pra tfs 1.2, pois ele tem as novas funções.

Os scripts há como passar pra funcionar no 1.0, mas estou fazendo um baseado nos bosses da warzone reconhecendo os danos aderidos dos jogadores, fica mais fácil, não fica 100% global mas acho mais prático e sem intervenções nas sources.

Link para o comentário
Compartilhar em outros sites

Aqui tá meio louco.. instalei, compilei, e etc... porém, ao tentar fazer login no servidor não faz... só fica carregando, eu removo o creaturescripts volta normalmente.

Link para o comentário
Compartilhar em outros sites

Eu já avisei que o código ta errado.
ele deu ctrl + c e ctrl + v e esqueceu algumas partes ...

sugiro que olhe na otland porém é english , eu fiz e deu certinho .. até dei umas modificadas nos arquivos pra ficar mais legal

Link para o comentário
Compartilhar em outros sites

  • 3 months later...
×
×
  • Criar Novo...