OTHispano
¿Quieres reaccionar a este mensaje? Regístrate en el foro con unos pocos clics o inicia sesión para continuar.

Ir abajo
··¤Ledtheron¤··
··¤Ledtheron¤··
Miembro
Mensajes Mensajes : 32

[MOD] Random Item Stats Empty [MOD] Random Item Stats

Vie Jun 29, 2012 9:41 pm
Hola, les traigo un script que a mi me encanto en lo personal!!
se trata que al matar un monster hay un chance de que el item salga +1 por ejemplo el +1 (en mi script) aumenta entre el 40 y 50% de ataque osea un spike sword normal es algo asi
spike sword atk 24
con este sistema, si sale reforzada (+1, +2 etc)
puede salir algo asi
+1 spike sword atk 24 + 12
puede subir defensa atk y velocidad de ataque... tambien sirve para las armor... por sierto no es necesario un item sino que solo funciona al lootear!! les encantara!! este script esta un poco configurado por mi, si el item sale +6 podria aumentar hasta 4.4 veces su atk original osea una spike sword podria salir asta con atk 24 + 96 pero el +6 es muuy dificil que salga!! en todo caso ustedes lo pueden modificar... ok aqui va

CREAN UN .XML LLAMADO RIS.xml EN LA CARPETA MODS Y LE PEGAN ESTO
Código:

<?xml version="1.0" encoding="UTF-8"?>
<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['+1'] = {
   color = TEXTCOLOR_LIGHTBLUE, -- color of 'RARE' text
   extra = {10, 10},
   effect = 10,
   chance = {
      [1] = 30000,
      [2] = 100000000,
      [3] = 100000000
   }
}
tiers['+2'] = {
   color = TEXTCOLOR_LIGHTBLUE,
   effect = 17,
   extra = {40, 40}, -- additional percent bonus
   chance = {
      [1] = 9333,
      [2] = 1000000000,
      [3] = 1000000000
   }
}
tiers['+3'] = {
   color = TEXTCOLOR_LIGHTBLUE,
   effect = 39,
   extra = {100, 100},
   chance = {
      [1] = 5000,
      [2] = 10000000000,
      [3] = 1000000000
   }
}
tiers['+4'] = {
   color = TEXTCOLOR_LIGHTBLUE,
   extra = {170, 170},
   effect = 49,
   chance = {
      [1] = 2500,
      [2] = 100000000000,
      [3] = 1000000000
   }
}
tiers['+5'] = {
   color = TEXTCOLOR_LIGHTBLUE,
   extra = {300, 300},
   effect = 37,
   chance = {
      [1] = 1000,
      [2] = 1000000000,
      [3] = 1000000000
   }
}
tiers['+6'] = {
   color = TEXTCOLOR_LIGHTBLUE,
   extra = {425, 425},
   effect = 53,
   chance = {
      [1] = 800,
      [2] = 1000000000,
      [3] = 1000000000
   }
}
 
MELEE = 0
DISTANCE = 1
ARMOR = 2
SHIELD = 3
WAND = 4
DURATION_RING = 5
CHARGES = 6
 
--! attributes
attr['rapido'] = {
   attr = 'attackSpeed',
   name = 'Velocidad de Ataque',
   percent = {20, 40},
   types = {MELEE, DISTANCE, WAND}
}
attr['fortificado'] = {
   attr = 'extraDefense',
   base = 'defense',
   name = 'Defensa',
   percent = {20, 40},
   types = {MELEE, SHIELD}
}
attr['mounstroso'] = {
   attr = 'extraAttack',
   base = 'attack',
   name = 'Ataque',
   types = {MELEE},
   percent = {20, 40}
}
attr['fuerte'] = {
   attr = 'armor',
   name = 'Armor',
   percent = {20, 40},
   types = {ARMOR}
}
attr['dinamico'] = {
   attr = 'hitChance',
   name = 'Hit Chance',
   percent = {20, 40},
   types = {DISTANCE}
}
attr['cargado'] = {
   attr = 'charges',
   name = 'Cargas',
   percent = {20, 40},
   types = {CHARGES}
}
attr['divino'] = {
   attr = 'duration',
   name = 'Duracion',
   percent = {35, 50},
   types = {DURATION_RING}
}
--/ attributes
 
rate = getConfigInfo('rateLoot')
]]></config>
 
<event type="kill" name="itemstats" event="script"><![CDATA[
domodlib('itemstats_conf')
 
function round(n, s)
   return tonumber(('%.' .. (s or 0) .. 'f'):format(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, tiers[ret].effect)
               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, tiers[ret].effect)
                     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>

Creditos
Cykotitan 99%
Ledtheron 1%

Por sierto vayan a config.lua
y donde dice
monsterLootMessage = 3
ponganle
monsterLootMessage = 2

Ok eso es todo adios Smile
Volver arriba
Permisos de este foro:
No puedes responder a temas en este foro.