Ir para conteúdo
  • 0

Problema com um script


gabriel28

Pergunta

Não sei porque o outro tópico que fiz foi fechado sem aviso algum, mas emfim.

 

Tenho um script que a arma vai ganhando experiência e upa de acordo com a quantidade de monstros que o player mata, deixando o item +1 até +10. Só que, ao invés da descrição do item ficar: You see a brass armor +2 (arm: 9), fica assim: You see a brass armor +1 +2 (arm: 10). Sempre que upa o level, vai acrescentando na descrição.

Segue o script do sistema:

Spoiler
function getItemExp(item)    if item.itemid > 0 then        return getItemAttribute(item.uid, "exp") or 0    end    return falseendfunction getItemLevel(item)    if item.itemid > 0 then        return getItemAttribute(item.uid, "level") or 0    end    return falseendfunction doItemAddExp(item)    if item.itemid > 0 then        return doItemSetAttribute(item.uid, "exp", getItemExp(item) + 1)    end    return falseendfunction doItemAddLevel(item, count)    if item.itemid > 0 and tonumber(count) then        return doItemSetAttribute(item.uid, "level", getItemLevel(item) + count)    end    return falseendlocal table_of_slots = {"head", "body", "legs", "feet", "hands"}  --Slots. Ex.: {"head", "body"}local min_exp = 500 -- Exp mínima para o monstro valer (exp que fica no monster.xml)local exp_levels = {2, 4, 6, 180, 280, 400, 550, 700, 900, 1500} -- Exp pra upar. A cada vez que um item atigingir um desses valores de exp, ele upa 1 lvl. (Tem 10, ou seja, nível máximo do item = 10) Pode por mais leveis se quiser.local slots = {    ["head"] = 1,     ["body"] = 4,    ["legs"] = 7,    ["feet"] = 8,    ["hands"] = {5, 6},}function onKill(cid, target, lastHit)           local tab = {}        if isPlayer(cid) and isMonster(target) then        if getMonsterInfo(getCreatureName(target)).experience >= min_exp then            if #table_of_slots > 0 then                for a, b in pairs(table_of_slots) do                    if slots[b] then                        if type(slots[b]) == "table" then                            for i = 1, #slots[b] do                                local tb = slots[b]                                table.insert(tab, tb[i])                            end                        else                            table.insert(tab, slots[b])                        end                    end                end            end            if #tab > 0 then                for i = 1, #tab do                    local item = getPlayerSlotItem(cid, tab[i])                    if item.uid > 0 then                        doItemAddExp(item)                        if getItemLevel(item) then                            if isInArray(exp_levels, getItemExp(item)) then                                if getItemInfo(item.itemid).attack > 0 or getItemInfo(item.itemid).defense > 0 or getItemInfo(item.itemid).armor > 0 then                                    if getItemLevel(item) ~= #exp_levels then                                        doItemAddLevel(item, 1)                                        doItemSetAttribute(item.uid, "name", getItemName(item.uid).." +"..getItemLevel(item))                                        doSendMagicEffect(getThingPos(cid), 28)                                        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Seu "..getItemNameById(item.itemid).." atingiu "..getItemExp(item).."exp e ganhou 1 level! Agora ele esta level "..getItemLevel(item))                                        local atk = getItemAttribute(item.uid, "attack") or getItemInfo(item.itemid).attack                                        local def = getItemAttribute(item.uid, "defense") or getItemInfo(item.itemid).defense                                        local arm = getItemAttribute(item.uid, "armor") or getItemInfo(item.itemid).armor                                        if getItemInfo(item.itemid).armor > 0 then                                            doItemSetAttribute(item.uid, "armor",arm + 1)                                        elseif getItemInfo(item.itemid).attack > 0 then                                            doItemSetAttribute(item.uid, "attack",atk + 1)                                        elseif getItemInfo(item.itemid).defense > 0 and getItemInfo(item.itemid).attack <= 0 then                                            doItemSetAttribute(item.uid, "defense",def + 1)                                         end                                                                          end                                end                            end                        end                    end                end            end        end    end    return trueendfunction onLogin(cid)    registerCreatureEvent(cid, "Item level")    return trueend

 

 

Gostaria que não conflitasse com outro script que tenho, que muda a descrição também. É um script que adiciona reflet ao equipamento, ficando: You see a brass armor ref 2% (arm: 8).
Dai com esse script, ficaria: You see a brass armor +1 ref 2% (arm: 9).

TFS 0.4 rev 3884 Tibia 8.6. 
Agradeço desde já.

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Substitui isso:

Citar
doItemSetAttribute(item.uid, "name", getItemName(item.uid).." +"..getItemLevel(item))

 

Por isso:

Citar

local txt =getItemName(item.uid) 

local pos1,pos2 = txt:find("%+(%d)")
if(pos1)then

doItemSetAttribute(item.uid, "name", txt:sub(1,pos1)..getItemLevel(item)..txt:sub(pos2+1,-1))
else
doItemSetAttribute(item.uid, "name", txt.." +"..getItemLevel(item))
end

 

Testa e verifica se ocorre algum erro.

Link para o comentário
Compartilhar em outros sites

  • 0

O problema consiste no seguinte,  sua função 

Citar
doItemSetAttribute(item.uid, "name", getItemName(item.uid).." +"..getItemLevel(item))

 

Está adicionando novos valores ao nome ao invés de substituir o valor desejado. 

Uma forma de resolver isso seria apagando os valores da string e recolocoando-os.

A dificuldade vai ser devido a outros scripts que façam algo semelhante, ou seja, que põe textos no nome.

 

Segue um esquema de como isso poderia ser feito.

Citar

Pega-Se a string com todos os valores.

Apaga os valores da string no objeto.

Substitue os valores da string.

Incrementa no objeto a string já corrigida.

 

Me passa como fica a string quando apenas esse script é usado; quando outro script que faz algo semelhante a esse é usado; quando são usados ambos (ou mais) scripts.

Assim poderei saber como manipular a string.

Link para o comentário
Compartilhar em outros sites

  • 0
9 horas atrás, Poccnn disse:

O problema consiste no seguinte,  sua função 

 

Eu tenho dois scripts que mudam o nome, esse ai que já coloquei, e esse aqui:

 

Spoiler
local config = {    reflectBonus = 2,               --Bônus de reflect, em %.    failChance = 10,                --Chance de falhar, em porcentagem.    types = {"armor", "legs", "helmet", "boots", "shield"},    noReflect = {1, 2, 3, 9, 10}     --Tipos de armamento bloqueados (valores podem ser conferidos em 000-constant.lua, data/lib)}function onUse(cid, item, fromPos, itemEx, toPos)    if itemEx.itemid < 100 then        return doPlayerSendCancel(cid, "Use this in valid itens.")    elseif isInArray(config.noReflect, getItemWeaponType(itemEx.uid)) then        return doPlayerSendCancel(cid, "Use this in valid itens.")    elseif getItemAttribute(itemEx.uid, "reflect") then        return doPlayerSendCancel(cid, "This item has already a reflect bonus.")    elseif math.random(1, 100) > config.failChance then        return doPlayerSendTextMessage(cid, 27, "Sorry, your item didn't get a reflect bonus. Good luck at the next try!"), doRemoveItem(item.uid, 1)    end    local checkItemName    for i = 1, #config.types do        if getItemNameById(itemEx.itemid):find(config.types[i]) then            checkItemName = true            break        end    end    if not checkItemName then        return doPlayerSendCancel(cid, "Use this in valid itens.")    end    doPlayerSendTextMessage(cid, 27, "Congratulations, now your item has a reflect bonus of "..config.reflectBonus.."%!")    doItemSetAttribute(itemEx.uid, "reflect", config.reflectBonus)	doItemSetAttribute(itemEx.uid, "name", getItemName(itemEx.uid).." ref "..config.reflectBonus.."%")    doRemoveItem(item.uid, 1)    return trueend

 

São esses dois que eu tenho que muda o nome.

No script original desse primeiro ai, que linkei antes, a parte que está o problema era essa: doItemSetAttribute(item.uid, "name", getItemNameById(item.itemid).." +"..getItemLevel(item))

Só que ela dessa forma, entrava em conflito com esse script que deixei nesse comentário. Comflitavam dessa forma: Quando o item tava +1 e eu colocava reflect, ao invés de ficar: You see a brass armor +1 ref 2% (arm: 9), esse "ref 2%" entrava no lugar do +1, ficando You see a brass armor ref 2% (arm: 9) . E se o item já tivesse esse "ref 2%" e eu colocasse +1, o +1 ficava no lugar do "ref 2%". Entende?  Os dois não ficavam juntos como deveria ser. Dai com a modificação que eu fiz nessa parte de dar o atributo name, do script de upgrade, o conflito não acontece mais, porém, acontece isso ai de ficar pondo +1 +2 +3...

Não sei se consegui ser claro.

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

  • 0
8 horas atrás, gabriel28 disse:

Eu tenho dois scripts que mudam o nome, esse ai que já coloquei, e esse aqui:

 

  Ocultar conteúdo
local config = {    reflectBonus = 2,               --Bônus de reflect, em %.    failChance = 10,                --Chance de falhar, em porcentagem.    types = {"armor", "legs", "helmet", "boots", "shield"},    noReflect = {1, 2, 3, 9, 10}     --Tipos de armamento bloqueados (valores podem ser conferidos em 000-constant.lua, data/lib)}function onUse(cid, item, fromPos, itemEx, toPos)    if itemEx.itemid < 100 then        return doPlayerSendCancel(cid, "Use this in valid itens.")    elseif isInArray(config.noReflect, getItemWeaponType(itemEx.uid)) then        return doPlayerSendCancel(cid, "Use this in valid itens.")    elseif getItemAttribute(itemEx.uid, "reflect") then        return doPlayerSendCancel(cid, "This item has already a reflect bonus.")    elseif math.random(1, 100) > config.failChance then        return doPlayerSendTextMessage(cid, 27, "Sorry, your item didn't get a reflect bonus. Good luck at the next try!"), doRemoveItem(item.uid, 1)    end    local checkItemName    for i = 1, #config.types do        if getItemNameById(itemEx.itemid):find(config.types[i]) then            checkItemName = true            break        end    end    if not checkItemName then        return doPlayerSendCancel(cid, "Use this in valid itens.")    end    doPlayerSendTextMessage(cid, 27, "Congratulations, now your item has a reflect bonus of "..config.reflectBonus.."%!")    doItemSetAttribute(itemEx.uid, "reflect", config.reflectBonus)	doItemSetAttribute(itemEx.uid, "name", getItemName(itemEx.uid).." ref "..config.reflectBonus.."%")    doRemoveItem(item.uid, 1)    return trueend

 

São esses dois que eu tenho que muda o nome.

No script original desse primeiro ai, que linkei antes, a parte que está o problema era essa: doItemSetAttribute(item.uid, "name", getItemNameById(item.itemid).." +"..getItemLevel(item))

Só que ela dessa forma, entrava em conflito com esse script que deixei nesse comentário. Comflitavam dessa forma: Quando o item tava +1 e eu colocava reflect, ao invés de ficar: You see a brass armor +1 ref 2% (arm: 9), esse "ref 2%" entrava no lugar do +1, ficando You see a brass armor ref 2% (arm: 9) . E se o item já tivesse esse "ref 2%" e eu colocasse +1, o +1 ficava no lugar do "ref 2%". Entende?  Os dois não ficavam juntos como deveria ser. Dai com a modificação que eu fiz nessa parte de dar o atributo name, do script de upgrade, o conflito não acontece mais, porém, acontece isso ai de ficar pondo +1 +2 +3...

Não sei se consegui ser claro.

Ele substitui pois os dois usam o Attribute > 

"name"

Nao sei como funciona o 

doItemSetAttribute

Mas tenta mudar para : "name1"

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...