Allods Online Addons (8/10): AutoSellGreyAddon

Juan Mellado, 1 Octubre, 2010 - 16:15

En este artículo se analiza un addon de Allods llamado "AutoSellGreyAddon". Su función es la de vender todos los objetos grises que lleva en la bolsa nuestro personaje, de forma automática, en el momento que se abra una ventana de diálogo con un vendedor. El autor utiliza el alias de Valltron, así que vayan para él todos los correspondientes créditos.

El addon se compone de sólo dos ficheros: el obligatorio "AddonDesc.(UIAddon).xdb", y un script llamado "ScriptAutoSell.lua". No hay más. Ni formularios, ni imágenes, ni nada más. Aunque la verdad es que no lo necesita.

El código del script empieza con la habitual llamada a la función "Init", que en ese caso se encarga de registrar dos eventos. El evento "EVENT_TALK_STARTED", que se lanza cuando se inicia una conversación con cualquier NPC del juego, no necesariamente vendedor. Y el evento "EVENT_TALK_STOPPED", que se lanza cuando se termina una conversación.

function Init()
  common.RegisterEventHandler(OnTalkStarted, "EVENT_TALK_STARTED")
  common.RegisterEventHandler(OnTalkStopped, "EVENT_TALK_STOPPED")
end

Al iniciarse una conversación con un NPC el juego invoca a la función "OnTalkStarted", donde se registra el evento "EVENT_VENDOR_LIST_UPDATED", que es el que Allods lanza cuando un vendedor solicita a nuestro personaje la lista de objetos que tiene en la bolsa disponibles para la venta. Y por su parte, al terminar una conversación, se invoca a la función "OnTalkStopped" que elimina el registro de dicho evento "EVENT_VENDOR_LIST_UPDATED".

function OnTalkStarted()
  common.RegisterEventHandler(OnVendorListUpdated, "EVENT_VENDOR_LIST_UPDATED")
end
function OnTalkStopped()
  common.UnRegisterEventHandler(OnVendorListUpdated, "EVENT_VENDOR_LIST_UPDATED")
end

Finalmente, la función "OnVendorListUpdated" es la que realmente hace todo el trabajo en una serie de pasos muy claros:
- Obtiene el número de objetos que tiene nuestro avatar en la bolsa
- Recorre cada objeto que hay en la bolsa
- Y si el objeto tiene una calidad inferior a 1 (gris) lo vende
- Una vez acabada la venta elimina el registro del evento

function OnVendorListUpdated()
  local currentBagSize = avatar.InventoryGetBaseBagSlotCount()
  for slotIndex = 0, currentBagSize - 1 do
    local itemId = avatar.GetInventoryItemId(slotIndex)
    if itemId then
      local itemInfo = avatar.GetItemInfo(itemId)
      if itemInfo.quality <= 1 then
        avatar.Sell(slotIndex, itemInfo.stackCount)
      end
    end
  end
  common.UnRegisterEventHandler(OnVendorListUpdated, "EVENT_VENDOR_LIST_UPDATED")
end

La función "avatar.InventoryGetBaseBagSlotCount" es la que obtiene el número de objetos de la bolsa nuestro personaje. La función "avatar.GetInventoryItemId(slotIndex)" es la que obtiene el ID de un objeto concreto de la bolsa dada su posición dentro de la misma, que recordemos que puede ser de una casilla que está vacía, por lo que es necesario comprobar que ha devuelto un ID de un objeto válido. La función "avatar.GetItemInfo(itemId)" es la que obtiene el detalle de los atributos del objeto dado, siendo el atributo "quality" el que indica el nivel del objeto, aunque este es sólo uno de las varias decenas de atributos que devuelve la función y merecen la pena echar un vistazo en la documentación. Finalmente, la función "avatar.Sell(slotIndex, itemInfo.stackCount)" es la que vende el objeto de la bolsa dada su posición, y en su cantidad total además.

Sin lugar a dudas este addon es muy claro ejemplo de sencillez y utilidad.

¿No encontró lo que buscaba?

Utilice el buscador para encontrar más páginas en esta web o en toda Internet.
 
Web www.inmensia.com