Ir para conteúdo
  • 0

Bag Reward Chest 1.x


GustavaoTibia

Pergunta

Olá gostaria de pedir uma força pra alguem ai.

Eu gostaria que este script me envie uma BAG por cada boss do reward chest que o jogador matar, atualmente ele esta enviando os items normal so que se eu mato 2 bosses iguais ou diferentes os items fica um em cima do outro, gostaria de separar.

Ex: matou um boss os items vai ser enviado dentro de uma bag ou backpack dependendo do id que colocar, quando eu matar o outro boss vou receber outra bag ou backpack e quando eu ir na ilha pegar os items do reward, lá vai esta 2 bag ou backpack e nao os items tudo juntos

Eu tentei mais consegui apenas enviar 1 item por cada bag ou backpack, ou seja, se eu matar um boss e ganhar 10 item, vai ser enviado 10 bags :\

 

Por fim o scritp é este:

 

function sort_descending(t)    local tmp = {}    for k, v in pairs(t) do        table.insert(tmp, {k, v})    end    table.sort(tmp, function(a, b) return a[2] > b[2] end)    return tmpendfunction table.find(t, v)    for i,x in pairs(t) do        if x == v then            return true        end    endendfunction Player:addItemRewardBag(itemid, count)local rewardbag = self:getDepotChest(99, true)    return rewardbag:addItem(itemid, count)endfunction MonsterType:getBossReward(chance, unique)    local ret = {}    local function randomItem(lootBlock, chance)        local randvalue = math.random(0, 100000) / (getConfigInfo("rateLoot") * chance)        if randvalue < lootBlock.chance then            if (ItemType(lootBlock.itemId):isStackable()) then                return (randvalue%lootBlock.maxCount) + 0            else                return 1            end        end    end    local lootBlockList = self:getLoot()    for _, loot in pairs(lootBlockList) do        local rd = randomItem(loot, chance)        if rd then            if loot.uniquedrop then                if unique then                    table.insert(ret, {loot, rd})                end            else                table.insert(ret, {loot, rd})            end        end    end    return retendBossLoot = {}BossUids = {}function BossLoot:new(boss)    if not table.find(BossUids, boss:getId()) then        table.insert(BossUids, boss:getId())        return setmetatable({creature=boss}, {__index = BossLoot})    endendfunction BossLoot:updateDamage()    if self.creature then        local tmp = {}        local totaldmg = 0        for killer, damage in pairs(self.creature:getDamageMap()) do            totaldmg = totaldmg+damage.total            tmp[killer] = damage.total        end        self.players = sort_descending(tmp)        self.totaldmg = totaldmg    else        error("Creature not found.")    endendfunction BossLoot:setRewards()    if self.totaldmg and self.creature then        if getConfigInfo("rateLoot") > 0 then            local mt = MonsterType(self.creature:getName())            for i, playertab in ipairs(self.players) do                local loot                if i == 1 then                    loot = mt:getBossReward(playertab[2] / self.totaldmg, true)                else                    loot = mt:getBossReward(playertab[2] / self.totaldmg, false)                end                table.insert(self.players[i], loot)            end        end    else        error("Error")    endendfunction BossLoot:addRewards()    if self.players and self.players[1] and self.players[1][3] then        for i, playertab in ipairs(self.players) do            local player = Player(playertab[1])            if player then                local str = "The following items are available in your reward chest: "                for i, lootTable in ipairs(playertab[3]) do                    local item = player:addItemRewardBag(lootTable[1].itemId, math.ceil(lootTable[2]))                    if item then                        str = str .. item:getNameDescription() .. ", "                    end                end                str = str:sub(1, #str-2)                player:sendTextMessage(MESSAGE_EVENT_ADVANCE, str)            end        end    else        error("Error")    endendfunction onKill(cid, target)target = Monster(target)    if (target ~= nil) then        local mt = MonsterType(target:getName())        if mt:useRewardChest() then            local loot = BossLoot:new(target)            if loot then                local corpse = Item(doCreateItem(MonsterType(target:getName()):getCorpseId(), 1, target:getPosition()))                doDecayItem()                target:setDropLoot(false)                loot:updateDamage()                loot:setRewards()		loot:addRewards()                corpse:setAttribute('aid', 21584)            end        end    end	return trueend

 

Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0

O script é comprido, então não li ele todo, mas acho que posso ajudar...

 

                for i, lootTable in ipairs(playertab[3]) do                    local item = player:addItemRewardBag(lootTable[1].itemId, math.ceil(lootTable[2]))                    if item then                        str = str .. item:getNameDescription() .. ", "                    end                end

Você tem que criar a bag antes desse loop for, e durante o loop for você adiciona os itens na bag e depois do end você envia a bag ao player.

 

Se ainda tiver dificuldade explica passo a passo o que tá acontecendo, e o que você quer que aconteça, exemplo a bag deve ir pro dp do jogador?

Link para o comentário
Compartilhar em outros sites

  • 0

@Eskylo Os items ja esta indo para o DEPOT mais o problema que ele vai em items.. não em uma BAG, eu fiz um jeito de ir 1 item por bag ou seja, se o boss me dar 100 items vai ser enviado 100 BAGS com 1 item dentro.

Eu so gostaria que fosse 1 bag por cada boss, matar 1 boss e ir todos os items que sair dele pra 1 bag só... deu pra entender? ja tentei editar essa parte ai mais "bugou" o script...

Poderia fazer um tipo de exemplo pra eu testar?

Link para o comentário
Compartilhar em outros sites

  • 0
local bagId = 2000 -- coloque o id da bagfunction BossLoot:addRewards()    if self.players and self.players[1] and self.players[1][3] then        for i, playertab in ipairs(self.players) do            local player = Player(playertab[1])            if player then                local str = "The following items are available in your reward chest: "                local bagUid = Game.createItem(bagId, 1)                for i, lootTable in ipairs(playertab[3]) do                    local item = bagUid:addItem(lootTable[1].itemId, math.ceil(lootTable[2]))                    if item then                        str = str .. item:getNameDescription() .. ", "                    end                end                player:addItemRewardBag(bagUid)                str = str:sub(1, #str-2)                player:sendTextMessage(MESSAGE_EVENT_ADVANCE, str)            end        end    else        error("Error")    endend
function Player:addItemRewardBag(item)local rewardbag = self:getDepotChest(99, true)    return rewardbag:addItemEx(item)end

substitui essas 2 funções

 

faz muito tempo que não mexo com tfs 1.x então pode ser que dê algum erro, mas tentei D:

Editado por Eskylo
Link para o comentário
Compartilhar em outros sites

  • 0

@Eskylo amigo, obrigado eu ainda não testei mais creio que será de otima ajuda.

Mais eu achei outro problema nele.. tipo se eu sumonar um monstro e colocar ele para atacar o monstro que tiver na lista do REWARD CHEST (boss) se ele matar o servidor cai... creio que seja porque os items do boss vai ser enviado pro monstro e como ele nao é um jogador o server cai.

 

Será que tem um jeito de colocar no ONKILL apenas os jogadores que matar receber? se caso não for um jogador não acontece nada será possível isso?

Link para o comentário
Compartilhar em outros sites

  • 0
function onKill(cid, target)local killer = Creature(cid)if not killer:isPlayer() then	return trueendtarget = Monster(target)    if (target ~= nil) then        local mt = MonsterType(target:getName())        if mt:useRewardChest() then            local loot = BossLoot:new(target)            if loot then                local corpse = Item(doCreateItem(MonsterType(target:getName()):getCorpseId(), 1, target:getPosition()))                doDecayItem()                target:setDropLoot(false)                loot:updateDamage()                loot:setRewards()		loot:addRewards()                corpse:setAttribute('aid', 21584)            end        end    end	return trueend

Coloquei uma verificação na onkill, mas não tenho certeza se o problema está aqui mesmo. O script de 1 bag por boss deu certo?

Link para o comentário
Compartilhar em outros sites

  • 0

@Eskylo obrigado amigo, deu certo perfeitamente o negocio da BAG e teve o resultado que eu esperava, não esta caindo o server pelo menos do jeito de antes não.

Mais agora tem o problema do summon, tipo se o jogador summonar algum monstro e ele participar ou matar o boss do reward chest o server cai...

 

Eu coloquei aquilo que voce passou ali no onkill e parece que não deu :|:

Tem como me ajudar neste caso também?

 

@Eskylo me desculpe pela demora para responder, é que a maquina que uso para teste teve um problema nela e pedi para formatarem.

Editado por GustavaoTibia
Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...