[MACRO] Script para ordenar el equipo

Bueno, me he hecho unos scrips (en realidad el segundo solo cambia 2 o 3 cosas) que ordenan el inventario por ilvl (Item Level) y por rareza (el color el nombre: gris, blanco, verde, azul...) en orden de mayor ilvl o mayor rareza a menor, de forma que tus mejores items se quedan en la primera y los peores en la ultima. Lo pongo aqui porque me hubiera gustado tenerlo desde hace mucho tiempo, sobre todo cuando subia el nivel a un pj o farmeaba.

El script del ilvl es:

Código: [Seleccionar]
function vacioAlFinal(bolsa, casilla)
if not(casilla == GetContainerNumSlots(bolsa)) then
PickupContainerItem(bolsa, casilla+1)
PickupContainerItem(bolsa, casilla)
else

if not(nil ==GetContainerItemID(bolsa+1,1)) then
PickupContainerItem(bolsa+1, 1)
PickupContainerItem(bolsa, casilla)
end
end
end

function obtenerIlvl(bolsa, casilla)
for i=1, 2, 1 do

if ((bolsa == 4) and (casilla == GetContainerNumSlots(4))) or ((GetContainerNumSlots(bolsa+1) == 0) and (casilla == GetContainerNumSlots (bolsa)))  then ilvl = {0, 0}  else

if (casilla == GetContainerNumSlots(bolsa)) and (i==2) then
cambioBolsa = {1, 0}
else
cambioBolsa = {0, 1}
end
itemID = GetContainerItemID(bolsa + cambioBolsa[1], casilla *cambioBolsa[2] +i-1)

if itemID == nil then ilvl[i]=0 else
a, a, a, ilvl[i] = GetItemInfo(itemID)
end
end
end
end

for bolsa = 0, 4, 1 do

    for casilla = 1, GetContainerNumSlots(bolsa), 1 do
        ilvl = {0, 0}
      
        if not(nil ==GetContainerItemID(bolsa,casilla)) then
      
            obtenerIlvl(bolsa, casilla)
        else
            vacioAlFinal(bolsa, casilla)
        end

        if ilvl[1] < ilvl[2] then
            PickupContainerItem(bolsa, casilla)
          
            if casilla == GetContainerNumSlots(bolsa) then
                casilla = 1; bolsa = bolsa +1; PickupContainerItem(bolsa, casilla)
            else
                PickupContainerItem(bolsa, casilla+1)
            end
        end      
    end
end
if CursorHasItem() then ClearCursor() end

y el script por rareza es:

Código: [Seleccionar]
function vacioAlFinal(bolsa, casilla)
if not(casilla == GetContainerNumSlots(bolsa)) then
PickupContainerItem(bolsa, casilla+1)
PickupContainerItem(bolsa, casilla)
else

if not(nil ==GetContainerItemID(bolsa+1,1)) then
PickupContainerItem(bolsa+1, 1)
PickupContainerItem(bolsa, casilla)
end
end
end

function obtenerRareza(bolsa, casilla)
for i=1, 2, 1 do

if ((bolsa == 4) and (casilla == GetContainerNumSlots(4))) or ((GetContainerNumSlots(bolsa+1) == 0) and (casilla == GetContainerNumSlots (bolsa)))  then rareza = {0, 0}  else

if (casilla == GetContainerNumSlots(bolsa)) and (i==2) then
cambioBolsa = {1, 0}
else
cambioBolsa = {0, 1}
end
itemID = GetContainerItemID(bolsa + cambioBolsa[1], casilla *cambioBolsa[2] +i-1)

if itemID == nil then rareza[i]=0 else
a, a, rareza[i] = GetItemInfo(itemID)
end
end
end
end

for bolsa = 0, 4, 1 do

    for casilla = 1, GetContainerNumSlots(bolsa), 1 do
        rareza = {0, 0}
      
        if not(nil ==GetContainerItemID(bolsa,casilla)) then
      
            obtenerRareza(bolsa, casilla)
        else
            vacioAlFinal(bolsa, casilla)
        end

        if rareza[1] < rareza[2] then
            PickupContainerItem(bolsa, casilla)
          
            if casilla == GetContainerNumSlots(bolsa) then
                casilla = 1; bolsa = bolsa +1; PickupContainerItem(bolsa, casilla)
            else
                PickupContainerItem(bolsa, casilla+1)
            end
        end      
    end
end
if CursorHasItem() then ClearCursor() end
pero al ser demasiado largo no se puede poner en un macro normal, necesitas la ayuda de algun addon como Super Duper Macro, que te permite hacer macros muy largos.
Al crear un macro con este addon (abrir el menu de macros normal, darle a la imagen o boton nuevo, pulsar en "new", seleccionar "script" y "global", pegar el script en el espacio grande y pulsar "save") necesitamos otro macro desde el que ejecutarlo(pero este lo haces como un macro normal):
Código: [Seleccionar]
/sdm run nombreDelScript(sustituir "nombreDelScript" por el nombre que le pusieras al script en el addon)
Despues lo colocamos en alguna barra y lo pulsamos muchas veces (creo que una vez por cada casilla) y vamos viendo que se mueve el equipo hasta que deja de moverse, cuando pare estara ordenado.


Pero como se que hay gente que ni para descargar un addon tiene ganas... tambien he hecho una version que no necesita addon, pero es un como mas dificil...:

Crearemos unos 5 macros que hay que ejecutar, los nombres en este caso dan igual:
macro 1(ilvl):
Código: [Seleccionar]
/run str1="a={} function a.a(u) return GetContainerNumSlots(u) end function a.b(b,c) return GetContainerItemID(b,c) end function a.c(u) d,d,d,il = GetItemInfo(u) return il end function a.d(b,c) PickupContainerItem(b,c) end function a.e() if "macro 2(ilvl):
Código: [Seleccionar]
/run str2="CursorHasItem() then ClearCursor() end end function vacioAlFinal(b,c) if not(c==a.a(b)) then a.d(b,c+1) a.d(b,c) else if not(nil==a.b(b+1,1)) then a.d(b+1,1) a.d(b,c) end end end function obtenerilvl(b,c) for i=1,2,1 do if ((b==4)and"macro 3(ilvl):
Código: [Seleccionar]
/run str3="(c==a.a(4)))or((a.a(b+1)==0)and(c==a.a(b))) then ilvl={0,0}  else if (c==a.a(b))and(i==2) then cb={1,0} else cb={0,1} end itemID=a.b(b+cb[1],c*cb[2]+i-1) if itemID==nil then ilvl[i]=0 else ilvl[i]=a.c(itemID) end end end end"macro 4(ilvl):
Código: [Seleccionar]
/run str4=" for b=0,4,1 do for c=1,a.a(b),1 do ilvl={0,0} if not(nil==a.b(b,c)) then obtenerilvl(b,c) else vacioAlFinal(b,c) end if ilvl[1]<ilvl[2] then a.d(b,c) if c==a.a(b) then c=1;b=b+1;a.d(b,c) else a.d(b,c+1) end end end end a.e()"y macro 5(ilvl):
Código: [Seleccionar]
/run RunScript(str1 .. str2 .. str3 .. str4)
o, para ordenar por rareza:
macro 1(rareza):
Código: [Seleccionar]
/run str1="a={} function a.a(u) return GetContainerNumSlots(u) end function a.b(b,c) return GetContainerItemID(b,c) end function a.c(u) d,d,ra = GetItemInfo(u) return ra end function a.d(b,c) PickupContainerItem(b,c) end function a.e() if "macro 2(rareza):
Código: [Seleccionar]
/run str2="CursorHasItem() then ClearCursor() end end function vacioAlFinal(b,c) if not(c==a.a(b)) then a.d(b,c+1) a.d(b,c) else if not(nil==a.b(b+1,1)) then a.d(b+1,1) a.d(b,c) end end end function obtenerRareza(b,c) for i=1,2,1 do if ((b==4)and"macro 3(rareza):
Código: [Seleccionar]
/run str3="(c==a.a(4)))or((a.a(b+1)==0)and(c==a.a(b))) then rareza={0,0}  else if (c==a.a(b))and(i==2) then cb={1,0} else cb={0,1} end itemID=a.b(b+cb[1],c*cb[2]+i-1) if itemID==nil then rareza[i]=0 else rareza[i]=a.c(itemID) end end end end"macro 4(rareza):
Código: [Seleccionar]
/run str4=" for b=0,4,1 do for c=1,a.a(b),1 do rareza={0,0} if not(nil==a.b(b,c)) then obtenerRareza(b,c) else vacioAlFinal(b,c) end if rareza[1]<rareza[2] then a.d(b,c) if c==a.a(b) then c=1;b=b+1;a.d(b,c) else a.d(b,c+1) end end end end a.e()"macro 5(rareza):
Código: [Seleccionar]
/run RunScript(str1 .. str2 .. str3 .. str4)
Una vez que tenemos los 5 macros hechos, usamos 1 vez los 4 primeros macros, estos guardaran en memoria el script en partes, despues usamos el 5º, que los une y ejecuta, este ultimo es igual que en el caso de usar el addon, hay que pulsarlo muchas veces hasta que el equipo deje de moverse y este ordenado.




Cosas a tener en cuenta:
  • no usarlo teniendo bolsas especiales (bolsas que solo pueden tener ciertos items, como las de profesion o la de los brujos).
  • si no tienes las 4 bolsas que puedes tener, deja la casilla de bolsa que no tenga bolsa a la izquierda, es decir la ultima, o se ordenara solo con lo que tenga en ella sin intercambiar items con las demas bolsas.
  • el ilvl no es el gs ni el nivel necesario para poder equipar un item
Recomiendo loguear despues de terminar con el macro para limpiar las variables globales, pero no es necesario y no creo que afecte en nada al rendimiento.

PD: el macro que hay que usar muchas veces, puedes darle todo lo rapido que quieras que no va a pasar nada malo, pero tampoco va a terminar antes por romper el raton.