Ir para conteúdo
  • Cadastre-se

(Resolvido)slot system


Ir para solução Resolvido por Zazeros,

Posts Recomendados

.Qual servidor ou website você utiliza como base? 

TFS 0.4 tibia 8.6

Qual o motivo deste tópico? 

Erro

Está surgindo algum erro? Se sim coloque-o aqui. 

[2/5/2020 23:17:35] [Error - CreatureScript Interface] 
[2/5/2020 23:17:35] data/creaturescripts/scripts/slot.lua:onLogin
[2/5/2020 23:17:35] Description: 
[2/5/2020 23:17:35] data/creaturescripts/scripts/slot.lua:189: attempt to index upvalue 'conditionSHI' (a number value)
[2/5/2020 23:17:35] stack traceback:
[2/5/2020 23:17:35]     data/creaturescripts/scripts/slot.lua:189: in function 'equip'
[2/5/2020 23:17:35]     data/creaturescripts/scripts/slot.lua:211: in function <data/creaturescripts/scripts/slot.lua:210>

Citar

Alguem me pode ajudar com esse erro? Obrigado

 

Você tem o código disponível? Se tiver publique-o aqui: 

---Script by mock the bear!
local conditionMP,conditionHP,conditionML,conditionCLUB,conditionSHI,conditionDIST,conditionAMP = {},{},{},{},{},{},{}
for i=1,100 do ---Carrega as conditions
   --- HP
   conditionHP = createConditionObject(CONDITION_ATTRIBUTES)
   setConditionParam(conditionHP, CONDITION_PARAM_TICKS, -1)
   setConditionParam(conditionHP, CONDITION_PARAM_STAT_MAXHEALTHPERCENT, 100+i)
   setConditionParam(conditionHP, CONDITION_PARAM_BUFF, true)
   setConditionParam(conditionHP, CONDITION_PARAM_SUBID, 50)
   --MANA
   conditionMP = createConditionObject(CONDITION_ATTRIBUTES)
   setConditionParam(conditionMP, CONDITION_PARAM_TICKS, -1)
   setConditionParam(conditionMP, CONDITION_PARAM_STAT_MAXMANAPERCENT, 100+i)
   setConditionParam(conditionMP, CONDITION_PARAM_BUFF, true)
   setConditionParam(conditionMP, CONDITION_PARAM_SUBID, 51)
   --Magic level
   conditionML = createConditionObject(CONDITION_ATTRIBUTES)
   setConditionParam(conditionML, CONDITION_PARAM_TICKS, -1)
   setConditionParam(conditionML, CONDITION_PARAM_STAT_MAGICLEVELPERCENT, 100+i)
   setConditionParam(conditionML, CONDITION_PARAM_BUFF, true)
   setConditionParam(conditionML, CONDITION_PARAM_SUBID, 52)
   --club axe sword
   conditionCLUB = createConditionObject(CONDITION_ATTRIBUTES)
   setConditionParam(conditionCLUB, CONDITION_PARAM_TICKS, -1)
   setConditionParam(conditionCLUB, CONDITION_PARAM_SKILL_CLUBPERCENT, 100+i)
   setConditionParam(conditionCLUB, CONDITION_PARAM_SKILL_SWORDPERCENT, 100+i)
   setConditionParam(conditionCLUB, CONDITION_PARAM_SKILL_AXEPERCENT, 100+i)
   setConditionParam(conditionCLUB, CONDITION_PARAM_BUFF, true)
   setConditionParam(conditionCLUB, CONDITION_PARAM_SUBID, 53)
   --- shield
   conditionSHI = createConditionObject(CONDITION_ATTRIBUTES)
   setConditionParam(conditionSHI, CONDITION_PARAM_TICKS, -1)
   setConditionParam(conditionSHI, CONDITION_PARAM_SKILL_SHIELDPERCENT, 100+i)
   setConditionParam(conditionSHI, CONDITION_PARAM_BUFF, true)
   setConditionParam(conditionSHI, CONDITION_PARAM_SUBID, 54)
   --- dist
   conditionDIST = createConditionObject(CONDITION_ATTRIBUTES)
   setConditionParam(conditionDIST, CONDITION_PARAM_TICKS, -1)
   setConditionParam(conditionDIST, CONDITION_PARAM_SKILL_DISTANCEPERCENT, 100+i)
   setConditionParam(conditionDIST, CONDITION_PARAM_BUFF, true)
   setConditionParam(conditionDIST, CONDITION_PARAM_SUBID, 55)
end
function getSlotType(n) --By mock the bear
   if not n then
      return false
   end
   if n:match('%[(.+)%]') then
      n = n:match('%[(.+)%]')
      if n == '?' then
         return 0,n
      else
         return n:match('(.-)%.([+-])(%d+)%%')
      end
   else
      return false
   end
 
end
local function loadSet(cid)
   local t = {}
   for slot=1,9 do
      t[slot] = ''
 
      local s = getPlayerSlotItem(cid,slot).uid
      if s ~= 0 then
         t[slot] = getItemName(s)
      end
   end
   return t
end
function isInArray2(arr,var) -- Because in some servers it return 1 and 0 and others true and false
   for i,b in pairs(arr) do
      if var == b then
         return true
      end
   end
   return false
end
function check2(cid,i)
   if i == 5 or i == 6 then
      if isInArray({'head','necklace','backpack','body','legs','feet','ring'},getItemValue(getPlayerSlotItem(cid,i).itemid,'slotType') or '') then
         return false
      end
   end
   return true
end
function chk(cid,f)
   if not isPlayer(cid) then return end
   local t = loadSet(cid)
   for i=1,#f do
      if f ~= t then
         equip(cid,nil,slot)
         break
      end
   end
   addEvent(chk,2000,cid,t)
end
items = { ---- Only to get attr: slotType because getItemName dont return it -.-'
   _VERSION='1.0 By mock',
   XML_DIR='data/items/items.xml',
   }
do
   local ia = os.clock()
   io.write('Loading items')
   local i = io.open(items.XML_DIR,'r')
   local u = i:read(-1)
   i:close()
   local u = u:match('<items>(.+)</items>')
   for mi,id,mid,name,data,me in u:gmatch('<(%a-)%s*id%s*=%s*"(%d+)"%s*(.-)%s*name%s*=%s*"(.-)"%s*>(.-)</(%a*)>') do
      if mi == 'item' and me == 'item' then
         local td = {name=name,id=id,type=1}
         for key,value in data:gmatch('<attribute key="(.-)" value="(.-)"/>') do
            td[key] = value
         end
         for key,value in mid:gmatch('(.-)="(.-)"') do
            td[key] = value
         end
         items[tonumber(id)] = td
 
         items[name] = td
      end
   end
   for mi,id,mid,name,data in u:gmatch('<(%a-)%s*id%s*=%s*"(%d*)"%s*(.-)%s*name%s*=%s*"(%a+)"%s*/>') do
      if mi == 'item' then
         local td = {name=name,id=id,type=2}
         for key,value in mid:gmatch('(.-)="(.-)"') do
            td[key] = value
         end
         items[tonumber(id)] = td
         items[name] = td
      end
   end
   io.write('[done '..os.clock()-ia..']\n')
end
function getItemValue(item,value)
   return items[item] and items[item][value]
end
function equip(cid,item,slot) --By mock the bear
   local HP = getCreatureHealth(cid)
   local MP = getCreatureMana(cid)
   local t = {}
   if item then
      local mm,sinal,qto = getSlotType(getItemName(item.uid))
      t[mm] = tonumber(qto)
   end
   for i=1,9 do -- Not on slot 10 > arrow
      if i ~= slot then
         if getPlayerSlotItem(cid,i).itemid ~= 0 then
            local aab = getPlayerSlotItem(cid,i).uid
            if aab and check2(cid,i) then
               for _ in getItemName(aab):gmatch('(%[.-%])') do
                  local mm,sinal,qto2 = getSlotType(_)
                  if mm then
                     if not t[mm] then
                        t[mm] = 0
                     end
                     t[mm] = t[mm]+tonumber(qto2)
 
                     t[mm] = t[mm] > 100 and 100 or t[mm]
                  end
               end
            end
         end
      end
   end
   local fu = 0
   local ca = {}
   local s = ''
   for sl,n in pairs(t) do
      fu = fu+1
      s = s..''..n..'% more of '..sl..'\n'
      if sl == 'hp' then
         doAddCondition(cid,conditionHP[tonumber(n)])
         doCreatureAddHealth(cid,HP-getCreatureHealth(cid))
         ca[50] = 1
         doPlayerSendTutorial(cid,19)
      elseif sl == 'mp' then
         doAddCondition(cid,conditionMP[tonumber(n)])
         doCreatureAddMana(cid,HP-getCreatureMana(cid))
         ca[51] = 1
         doPlayerSendTutorial(cid,19)
      elseif sl == 'ml' then
         doAddCondition(cid,conditionML[tonumber(n)])
         ca[52] = 1
      elseif sl == 'cas' then
         doAddCondition(cid,conditionCLUB[tonumber(n)])
         ca[53] = 1
      elseif sl == 'shield' then
         doAddCondition(cid,conditionSHI[tonumber(n)])
         ca[54] = 1
      elseif sl == 'dist' then
         doAddCondition(cid,conditionDIST[tonumber(n)])
         ca[55] = 1
      end
   end
   if fu > 0 then
      addEvent(doPlayerSendTextMessage,100,cid,24,'You have:\n'..s)
      for i=50,55 do
         if not ca then
            doRemoveCondition(cid,CONDITION_ATTRIBUTES,i)
         end
      end
   else
      for i=50,55 do
         doRemoveCondition(cid,CONDITION_ATTRIBUTES,i)
      end
   end
   return true
end
function onLogin(cid) ---Script by mock the bear!
        equip(cid,nil,slot)
        addEvent(chk,2000,cid,loadSet(cid)) -- Here we check!
        return TRUE
end

 

 

Você tem alguma imagem que possa auxiliar no problema? Se sim, coloque-a aqui. 

 

Link para o post
Compartilhar em outros sites
  • Solução

@bellatrikz Tenta assim:

---Script by mock the bear!
local conditionMP,conditionHP,conditionML,conditionCLUB,conditionSHI,conditionDIST,conditionAMP = {},{},{},{},{},{},{}
for i=1,100 do ---Carrega as conditions
--- HP
conditionHP[i] = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionHP[i], CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionHP[i], CONDITION_PARAM_STAT_MAXHEALTHPERCENT, 100+i)
setConditionParam(conditionHP[i], CONDITION_PARAM_BUFF, true)
setConditionParam(conditionHP[i], CONDITION_PARAM_SUBID, 50)
--MANA
conditionMP[i] = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionMP[i], CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionMP[i], CONDITION_PARAM_STAT_MAXMANAPERCENT, 100+i)
setConditionParam(conditionMP[i], CONDITION_PARAM_BUFF, true)
setConditionParam(conditionMP[i], CONDITION_PARAM_SUBID, 51)
--Magic level
conditionML[i] = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionML[i], CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionML[i], CONDITION_PARAM_STAT_MAGICLEVELPERCENT, 100+i)
setConditionParam(conditionML[i], CONDITION_PARAM_BUFF, true)
setConditionParam(conditionML[i], CONDITION_PARAM_SUBID, 52)
--club axe sword
conditionCLUB[i] = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionCLUB[i], CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionCLUB[i], CONDITION_PARAM_SKILL_CLUBPERCENT, 100+i)
setConditionParam(conditionCLUB[i], CONDITION_PARAM_SKILL_SWORDPERCENT, 100+i)
setConditionParam(conditionCLUB[i], CONDITION_PARAM_SKILL_AXEPERCENT, 100+i)
setConditionParam(conditionCLUB[i], CONDITION_PARAM_BUFF, true)
setConditionParam(conditionCLUB[i], CONDITION_PARAM_SUBID, 53)
--- shield
conditionSHI[i] = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionSHI[i], CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionSHI[i], CONDITION_PARAM_SKILL_SHIELDPERCENT, 100+i)
setConditionParam(conditionSHI[i], CONDITION_PARAM_BUFF, true)
setConditionParam(conditionSHI[i], CONDITION_PARAM_SUBID, 54)
--- dist
conditionDIST[i] = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionDIST[i], CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionDIST[i], CONDITION_PARAM_SKILL_DISTANCEPERCENT, 100+i)
setConditionParam(conditionDIST[i], CONDITION_PARAM_BUFF, true)
setConditionParam(conditionDIST[i], CONDITION_PARAM_SUBID, 55)
end
function getSlotType(n) --By mock the bear
if not n then
return false
end
if n:match('%[(.+)%]') then
n = n:match('%[(.+)%]')
if n == '?' then
return 0,n
else
return n:match('(.-)%.([+-])(%d+)%%')
end
else
return false
end

end
local function loadSet(cid)
local t = {}
for slot=1,9 do
t[slot] = ''

local s = getPlayerSlotItem(cid,slot).uid
if s ~= 0 then
t[slot] = getItemName(s)
end
end
return t
end
function isInArray2(arr,var) -- Because in some servers it return 1 and 0 and others true and false
for i,b in pairs(arr) do
if var == b then
return true
end
end
return false
end
function check2(cid,i)
if i == 5 or i == 6 then
if isInArray({'head','necklace','backpack','body','legs','feet','ring'},getItemValue(getPlayerSlotItem(cid,i).itemid,'slotType') or '') then
return false
end
end
return true
end
function chk(cid,f)
if not isPlayer(cid) then return end
local t = loadSet(cid)
for i=1,#f do
if f[i] ~= t[i] then
equip(cid,nil,slot)
break
end
end
addEvent(chk,2000,cid,t)
end
items = { ---- Only to get attr: slotType because getItemName dont return it -.-'
_VERSION='1.0 By mock',
XML_DIR='data/items/items.xml',
}
do
local ia = os.clock()
io.write('Loading items')
local i = io.open(items.XML_DIR,'r')
local u = i:read(-1)
i:close()
local u = u:match('<items>(.+)</items>')
for mi,id,mid,name,data,me in u:gmatch('<(%a-)%s*id%s*=%s*"(%d+)"%s*(.-)%s*name%s*=%s*"(.-)"%s*>(.-)</(%a*)>') do
if mi == 'item' and me == 'item' then
local td = {name=name,id=id,type=1}
for key,value in data:gmatch('<attribute key="(.-)" value="(.-)"/>') do
td[key] = value
end
for key,value in mid:gmatch('(.-)="(.-)"') do
td[key] = value
end
items[tonumber(id)] = td

items[name] = td
end
end
for mi,id,mid,name,data in u:gmatch('<(%a-)%s*id%s*=%s*"(%d*)"%s*(.-)%s*name%s*=%s*"(%a+)"%s*/>') do
if mi == 'item' then
local td = {name=name,id=id,type=2}
for key,value in mid:gmatch('(.-)="(.-)"') do
td[key] = value
end
items[tonumber(id)] = td
items[name] = td
end
end
io.write('[done '..os.clock()-ia..']\n')
end
function getItemValue(item,value)
return items[item] and items[item][value]
end
function equip(cid,item,slot) --By mock the bear
local HP = getCreatureHealth(cid)
local MP = getCreatureMana(cid)
local t = {}
if item then
local mm,sinal,qto = getSlotType(getItemName(item.uid))
t[mm] = tonumber(qto)
end
for i=1,9 do -- Not on slot 10 > arrow
if i ~= slot then
if getPlayerSlotItem(cid,i).itemid ~= 0 then
local aab = getPlayerSlotItem(cid,i).uid
if aab and check2(cid,i) then
for _ in getItemName(aab):gmatch('(%[.-%])') do
local mm,sinal,qto2 = getSlotType(_)
if mm then
if not t[mm] then
t[mm] = 0
end
t[mm] = t[mm]+tonumber(qto2)

t[mm] = t[mm] > 100 and 100 or t[mm]
end
end
end
end
end
end
local fu = 0
local ca = {}
local s = ''
for sl,n in pairs(t) do
fu = fu+1
s = s..''..n..'% more of '..sl..'\n'
if sl == 'hp' then
doAddCondition(cid,conditionHP[tonumber(n)])
doCreatureAddHealth(cid,HP-getCreatureHealth(cid))
ca[50] = 1
doPlayerSendTutorial(cid,19)
elseif sl == 'mp' then
doAddCondition(cid,conditionMP[tonumber(n)])
doCreatureAddMana(cid,HP-getCreatureMana(cid))
ca[51] = 1
doPlayerSendTutorial(cid,19)
elseif sl == 'ml' then
doAddCondition(cid,conditionML[tonumber(n)])
ca[52] = 1
elseif sl == 'cas' then
doAddCondition(cid,conditionCLUB[tonumber(n)])
ca[53] = 1
elseif sl == 'shield' then
doAddCondition(cid,conditionSHI[tonumber(n)])
ca[54] = 1
elseif sl == 'dist' then
doAddCondition(cid,conditionDIST[tonumber(n)])
ca[55] = 1
end
end
if fu > 0 then
addEvent(doPlayerSendTextMessage,100,cid,24,'You have:\n'..s)
for i=50,55 do
if not ca[i] then
doRemoveCondition(cid,CONDITION_ATTRIBUTES,i)
end
end
else
for i=50,55 do
doRemoveCondition(cid,CONDITION_ATTRIBUTES,i)
end
end
return true
end
function onLogin(cid) ---Script by mock the bear!
equip(cid,nil,slot)
addEvent(chk,2000,cid,loadSet(cid)) -- Here we check!
return TRUE
end

 

Link para o post
Compartilhar em outros sites

@bellatrikz Tem sim, você tem que substituir em todos essa parte aqui

CONDITION_PARAM_STAT_MAXHEALTHPERCENT

Só você tirar o "PERCENT" de todos eles.

Esse é o de health, você tem que tirar o PERCENT da mana, shield, axe, sword e talz

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo