• TibiaFace

    Tibiaface | Una comunidad Open Tibia donde encontras : mapas, scripts, Otserver, npc y amigos etc ...

    .
    demo menumenu

    Afiliados



    Votar:

    [Mods] Ramdon Items

    Ver el tema anterior Ver el tema siguiente Ir abajo  Mensaje (Página 1 de 1.)

    1Thông báo [Mods] Ramdon Items el Sáb Ago 19, 2017 12:14 pm

    El Negrito

    avatar
    Nuevo Miembro
    Nuevo Miembro
    Bueno Aqui Les Comparto Este Mods Se Trata Que Al Matar Ejemplo : Un Dragon Y Lotea Dragon Scale Dependiendo Epic Rare Legendary
    Si El Items Es Rare Le Dara +Armor Y Asi En Cada Items

    Se Van A Mods Y Crean Un Archivo XML Y Pegan Esto Dentro

    Código:
    <mod name="Random Item Stats" enabled="1">
    <config name="itemstats_conf"><![CDATA[
    -- //
      extra_loot_key = 123 --: optional storage for higher loot rate
      vocation_base_attackspeed = getVocationInfo(1).attackSpeed --: used for attackSpeed stat
    -- //
     
    tiers, attr = {}, {}
     
    tiers['rare'] = {
      color = 66, -- color of 'RARE' text
      extra = {0, 0},
      attrNames = true, -- show attribute names instead of rare
      chance = {
          [1] = 10000,
          [2] = 5000 -- chance for 2nd stat
      }
    }
    tiers['epic'] = {
      color = 35,
      extra = {7, 20}, -- additional percent bonus
      chance = {
          [1] = 3333,
          [2] = 25000
      }
    }
    tiers['legendary'] = {
      color = 149,
      extra = {20, 35},
      chance = {
          [1] = 1000,
          [2] = 100000 -- 2 bonuses always
      }
    }
     
    MELEE = 0
    DISTANCE = 1
    ARMOR = 2
    SHIELD = 3
    WAND = 4
    DURATION_RING = 5
    CHARGES = 6
     
    --! attributes
    attr['quick'] = {
      attr = 'attackSpeed',
      name = 'Attack Speed',
      percent = {6, 20},
      types = {MELEE, DISTANCE, WAND}
    }
    attr['fortified'] = {
      attr = 'extraDefense',
      base = 'defense',
      name = 'Defense',
      percent = {7, 25},
      types = {MELEE, SHIELD}
    }
    attr['deadly'] = {
      attr = 'extraAttack',
      base = 'attack',
      name = 'Attack',
      types = {MELEE},
      percent = {7, 25}
    }
    attr['strong'] = {
      attr = 'armor',
      name = 'Armor',
      percent = {7, 20},
      types = {ARMOR}
    }
    attr['hawkeye\'s'] = {
      attr = 'hitChance',
      name = 'Hit Chance',
      percent = {10, 25},
      types = {DISTANCE}
    }
    --[[ // not available without source edit
    attr['farsight'] = {
      attr = 'shootRange',
      name = 'Shoot Range',
      percent = {17, 34},
      types = {DISTANCE, WAND}
    }
    ]]
    attr['charged'] = {
      attr = 'charges',
      name = 'Charges',
      percent = {30, 45},
      types = {CHARGES}
    }
    attr['divine'] = {
      attr = 'duration',
      name = 'Duration',
      percent = {35, 50},
      types = {DURATION_RING}
    }
    --/ attributes
     
    rate = getConfigInfo('rateLoot')
     
    if( getConfigInfo('monsterLootMessage') ~= 0 )then
      print('[Notice] Set monsterLootMessage = 0 to prevent duplicate loot messages')
    end
    ]]></config>
     
    <event type="kill" name="itemstats" event="script"><![CDATA[
    domodlib('itemstats_conf')
     
    function round(n, s)
      return tonumber(('%.' .. (s or 0) .. 'f')(n))
    end
     
    function getContentDescription(uid, sep)
      local ret, i, containers = '', 0, {}
      while( i < getContainerSize(uid) )do
          local v, s = getContainerItem(uid, i), ''
          local k = getItemInfo(v.itemid)
          k.name = getItemAttribute(v.uid, 'name') or k.name
          if( k.name ~= '' )then
            if( v.type > 1 and k.stackable and k.showCount )then
                s = v.type .. ' ' .. k.plural
            else
                local article = getItemAttribute(v.uid, 'article') or k.article
                s = (article == '' and '' or article .. ' ') .. k.name
            end
            ret = ret .. (i == 0 and not sep and '' or ', ') .. s
            if( isContainer(v.uid) and getContainerSize(v.uid) ~= 0 )then
                table.insert(containers, v.uid)
            end
          else
            ret = ret .. (i == 0 and not sep and '' or ', ') .. 'an item of type ' .. v.itemid .. ', please report it to gamemaster'
          end
          i = i + 1
      end
      for i = 1, #containers do
          ret = ret .. getContentDescription(containers[i], true)
      end
      return ret
    end
     
    local function send(cid, corpse, monster)
      if( isPlayer(cid) )then
          local ret = corpse and isContainer(corpse) and getContentDescription(corpse)
          doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'Loot of ' .. monster .. ': ' .. (ret ~= '' and ret or 'nothing'))
          local party = getPlayerParty(cid)
          if( party )then
            for _, pid in ipairs(getPartyMembers(party)) do
                doPlayerSendChannelMessage(pid, '', 'Loot of ' .. monster .. ': ' .. (ret ~= '' and ret or 'nothing'), TALKTYPE_CHANNEL_W, CHANNEL_PARTY)
            end
          end
      end
    end
     
    local function createLoot(i, ext)
      local item = type(i.id) == 'table' and i.id[math.random(#i.id)] or i.id
      local random = math.ceil(math.random(100000) / ext)
      local tmpItem, f
     
      if( random < i.chance )then
          if i.subType == -1 then
            f = getItemInfo(item)
          end
          tmpItem = doCreateItemEx(item,
            i.subType ~= -1 and i.subType or
            f.stackable and random % i.count + 1 or
            f.charges ~= 0 and f.charges or
            1
          )
      end
     
      if( not tmpItem )then
          return
      end
     
      if( i.actionId ~= -1 )then
          doItemSetAttribute(tmpItem, 'aid', i.actionId)
      end
     
      if( i.uniqueId ~= -1 )then
          doItemSetAttribute(tmpItem, 'uid', i.uniqueId)
      end
     
      if( i.text ~= '' )then
          doItemSetAttribute(tmpItem, 'text', i.text)
      end
     
      local ret, done
     
      for k, v in pairs(tiers) do
          local cur, used = {}, {}
          for i = 1, #v.chance do
            if( math.random(100000) <= v.chance[i] )then
                if( f )then
                  f = getItemInfo(item)
                end
                if( not f.stackable )then
                  for m, n in pairs(attr) do
                      if( not table.find(used, m) and
                      (
                        ( table.find(n.types, MELEE) and table.find({WEAPON_SWORD, WEAPON_CLUB, WEAPON_AXE}, f.weaponType) ) or
                        ( table.find(n.types, DISTANCE) and f.weaponType == WEAPON_DIST and f.ammoType ~= 0 ) or
                        ( table.find(n.types, ARMOR) and f.armor ~= 0 and f.wieldPosition ~= CONST_SLOT_NECKLACE ) or
                        ( table.find(n.types, SHIELD) and f.defense ~= 0 and f.weaponType == WEAPON_SHIELD ) or
                        ( table.find(n.types, WAND) and f.weaponType == WEAPON_WAND ) or
                        ( table.find(n.types, DURATION_RING) and f.wieldPosition == CONST_SLOT_RING and f.transformEquipTo ~= 0 ) or
                        ( table.find(n.types, CHARGES) and table.find({CONST_SLOT_RING, CONST_SLOT_NECKLACE}, f.wieldPosition) and f.charges ~= 0 )
                      ) )then
                        table.insert(cur, m)
                      end
                  end
     
                  if( #cur ~= 0 )then
                      local n = cur[math.random(#cur)]
                      table.insert(used, n)
     
                      n = attr[n]
                      local percent, new, tmp = math.random(n.percent[1] + (v.extra[1] or 0), n.percent[2] + (v.extra[2] or 0))
                      -- hacks
                      if( n.attr == 'duration' )then
                        tmp = getItemInfo(f.transformEquipTo)
                        if tmp.transformDeEquipTo ~= item then
                            break
                        end
                        new = round( tmp.decayTime * (1 + percent / 100) * 1000 )
                      elseif( n.attr == 'attackSpeed' )then
                        new = round( vocation_base_attackspeed / (1 + percent / 100) )
                      elseif( n.attr == 'hitChance' ) then
                        new = round(
                            f.hitChance == -1 and
                              percent
                            or
                              f.hitChance * (1 + percent / 100)
                        )
                      else
                        new = round(
                            n.base and
                              f[n['attr']] + f[n['base']] * (percent / 100)
                            or
                              f[n['attr']] * (1 + percent / 100)
                        )
     
                        if( new == f[n[n.base and 'base' or 'attr']] )then -- no improvement
                            break
                        end
                      end
     
                      doItemSetAttribute(tmpItem, n.attr:lower(), new)
     
                      local name = getItemAttribute(tmpItem, 'name')
                      if( v.attrNames or not name )then
                        local name = (v.attrNames and used[#used] or k) .. ' ' .. (name or f.name)
                        doItemSetAttribute(tmpItem, 'name', name)
     
                        if( f.article ~= '' )then
                            local article = getArticle(name)
                            if( article ~= f.article )then
                              doItemSetAttribute(tmpItem, 'article', article)
                            end
                        end
                      end
     
                      local desc = getItemAttribute(tmpItem, 'description') or f.description
                      doItemSetAttribute(tmpItem, 'description', '[' .. n.name .. ': +' .. percent .. '%]' .. (desc == '' and '' or '\n' .. desc))
     
                      ret = k
                  end
                  cur = {}
                  if( #v.chance == i )then
                      done = true
                  end
                end
            else
                done = i ~= 1
                break
            end
          end
          if( done )then
            break
          end
      end
     
      return tmpItem, ret
    end
     
    local function createChildLoot(parent, i, ext, pos)
      if( not i or #i == 0 )then
          return true
      end
     
      local size, cap = 0, getContainerCap(parent)
      for k = 1, #i do
          if( size == cap )then
            break
          end
          local tmp, ret = createLoot(i[k], ext)
          if( tmp )then
            if( isContainer(tmp) )then
                if( createChildLoot(tmp, i[k].child, ext, pos) )then
                  doAddContainerItemEx(parent, tmp)
                  size = size + 1
                else
                  doRemoveItem(tmp)
                end
            else
                if( ret )then
                  doSendMagicEffect(pos, CONST_ME_MAGIC_GREEN)
                  doSendAnimatedText(pos, ret:upper(), tiers[ret].color)
                end
                doAddContainerItemEx(parent, tmp)
                size = size + 1
            end
          end
      end
     
      return size > 0
    end
     
    local function dropLoot(pos, v, ext, master, cid, target)
      local corpse
      if( not master or master == target )then -- 0.3/4
          corpse = getTileItemById(pos, v.lookCorpse).uid
          if( isContainer(corpse) )then
            for i = 1, getContainerSize(corpse) do
                doRemoveItem(getContainerItem(corpse, 0).uid)
            end
            local size, cap = 0, getContainerCap(corpse)
            for i = 1, #v.loot do
                if( size == cap )then
                  break
                end
                local tmp, ret = createLoot(v.loot[i], ext)
                if( tmp )then
                  if( isContainer(tmp) )then
                      if( createChildLoot(tmp, v.loot[i].child, ext, pos) )then
                        doAddContainerItemEx(corpse, tmp)
                        size = size + 1
                      else
                        doRemoveItem(tmp)
                      end
                  else
                      if( ret )then
                        doSendMagicEffect(pos, CONST_ME_MAGIC_GREEN)
                        doSendAnimatedText(pos, ret:upper(), tiers[ret].color)
                      end
                      doAddContainerItemEx(corpse, tmp)
                      size = size + 1
                  end
                end
            end
          end
      end
      send(cid, corpse, v.description)
    end
     
    function onKill(cid, target, damage, flags)
      if( (damage == true or bit.band(flags, 1) == 1) and isMonster(target) )then -- 0.3/4
          local v = getMonsterInfo(getCreatureName(target))
          if( v and v.lookCorpse ~= 0 )then
            local s = getCreatureStorage(cid, extra_loot_key)
            addEvent(dropLoot, 0, getThingPos(target), v, s == -1 and rate or s, getCreatureMaster(target), cid, target)
          end
      end
      return true
    end
    ]]></event>
     
    <event type="login" name="itemstats_login" event="buffer"><![CDATA[
      registerCreatureEvent(cid, 'itemstats')
    ]]></event>
     
    </mod>

    Very Happy

    Ver perfil de usuario

    2Thông báo Re: [Mods] Ramdon Items el Sáb Ago 19, 2017 1:00 pm

    [Admin] God Maya

    avatar
    Administrador
    Administrador
    [Tienes que estar registrado y conectado para ver este vínculo]
    gran aporte gracias +1



    Ver perfil de usuario http://www.tibiaface.com

    3Thông báo Re: [Mods] Ramdon Items el Sáb Ago 19, 2017 10:39 pm

    The_Pain

    avatar
    Miembro
    Miembro
    [Tienes que estar registrado y conectado para ver este vínculo]
    Muy buen aporte amigo, +1



    Ver perfil de usuario

    Contenido patrocinado


    Ver el tema anterior Ver el tema siguiente Volver arriba  Mensaje (Página 1 de 1.)

    Permisos de este foro:
    No puedes responder a temas en este foro.