[Life is peripheral] Inventory Interface (tuto ?)

Voir le sujet précédent Voir le sujet suivant Aller en bas

[Life is peripheral] Inventory Interface (tuto ?)

Message par skypop le Mar 23 Aoû - 22:44

Ce topic pourrait avoir l'air d'un tuto, mais je ne saurais pas le faire.
Ce serait plutôt un brouillon, j'espère que chacun qui serait intéressé par ce mod contribuera à ce topic en ajoutant ses remarques, découvertes, astuces, idées d'applications...
Ainsi à terme, peut être bien qu'un tuto verra le jour.

L'Inventory Interface (Life is Peripheral) se connecte et s'utilise comme n'importe quel périphérique. Voici la liste des méthodes :

  • getItemInInventory()
    Renvoi une table des slots, et pour chaque slot une table de toutes les données du stack d'item contenu, une table vide si le slot est vide
  • getItemInSlot()
    Prend en paramètre le numéro du slot. Renvoi une table listant toutes les données du stack d'item contenu
  • getInventorySize()
    Renvoi le nombre de slot du contenur, sinon nil
  • getInventoryType()
    Renvoi le type de conteneur sous forme de string. "Chest" (coffre lambda, double ou piégé), "Dispenser", "Dropper", "Hopper", "Furnace", "EnderChest", "EnchantmentTable", "BrewingStand", "ox$TileEntityJukeBox" (bizarre) pour ceux que j'ai pu tester (Ne fonctionne pas sur une enclume)
  • getMethods()
    Retourne la liste des méthodes
    Prend en paramètre le nom d'une méthode sous forme de string pour renvoyer des détails sur la méthode concernée


L'Inventory Interface permet de scanner l'inventaire d'un bloc conteneur.
Le détail des items est absolument complet, c'est aussi détaillé que si vous utilisiez un Command Computer. à titre de comparaison, turtle.getItemDetail() n'en retourne qu'une petite fraction.

à titre d'exemple, voici les données d'un stack de 16 pommes :
Code:
{
  Enchants = {},
  lifeMaxDuration = 0,
  lifeDuration = 0,
  displayName = "Apple",
  stackSize = 16,
  slot = 0,
  isItemDamaged = false,
  maxStackSize = 64,
  isStackable = true,
  metadata = 0,
  isItemEnchantable = false,
  hasDisplayName = false,
  name = "minecraft:apple",
  datatags = {
    id = "minecraft:apple",
    Count = 16,
    Damage = 0,
  },
  isEnchanted = false,
  repairCost = 0,
}
à titre de comparaison, turtle.getItemDetail() renverrai ça :
Code:
{
  count = 16,
  name = "minecraft:apple",
  Damage = 0,
}

Voyez, l'Inventory Interface permettrait de distinguer les différents types d'enchantements, si l'objet a été renommé et comment, le contenu d'un document imprimé... Le potentiel n'est pas négligeable (quelques exemple de détails en fin de post).
Par exemple, il rend plus envisageable d'exploiter le loot de certaines usines, qui jusque là étaient plus considérés comme de la ferraille qui encombre les coffres. Ces items peuvent être triés, réparés et filtrés (conserver certains enchantement plus que d'autres, ou d'un certain niveau).

Des conteneurs vanilla :  coffres, trapped_chest, dispenser, dropper, hopper, furnace, brewing stand?, jukebox?, table d'enchantement?, enclumes?
Je n'ai pas testé les derniers, et pour les autres, mis à part pour les coffres il semble que ça bug. (enfin j'ai pas réussi à obtenir quelque chose)
Les minecarts avec coffre, hopper, four... ne sont pas des blocs, mais des entités. Je n'ai pas testé, mais je doute que ça fonctionne.

Des conteneurs computercraft, il semble que ça bug pour l'instant.
Je ne me lancerais pas dans un test complet. Merci de rapporter dans ce topic les tests que vous avez fait, pour que chacun profitte d'un recencement plus exhaustif.

Pour faire fonctionner l'Inventory Interface :
Il faut qu'il soit posé à un des côtés d'un computer ou d'une turtle (n'importe).
L'Inventory interface est un bloc orienté. C'est à dire qu'il analysera un bloc conteneur qui se trouve à l'un de ses côtés. Ce côté est marqué d'un carré jaune :


Note aussi, que l'inventaire du bloc doit être accessible. Par exemple, si vous posez un bloc plein sur un coffre vanilla, vous ne pourrez plus l'ouvrir. Dans le même cas, l'Inventory Interface ne fonctionne pas.

Applications :
Comme il s'agit d'items, l'utilité de cet interface evidement lié aux turtles.
Malheureusement, le fait que le scan de l'inventaire d'une turtle bug, rend l'utilisation la plus élémentaire inefficace.
Il s'agirait pour la turtle de se placer devant le capteur de l'interface, afin de scanner en détail son propre inventaire.
Screenshots:


La meilleure alternative que j'ai trouvé consiste à orienter l'interface vers un double chest. La turtle venant se caler contre le chest et l'interface en même temps, peut déposer des objets dans le coffre et les analyser.
Comme turtle.suck() ne permet d'aspirer que le premier slot disponible d'un coffre, il ne serait pas évident de sélectionner n'importe quel item du coffre, quand bien même, grace à l'interface nous conaitrions sa position.
Ce qui pourrait impliquer ce genre d'installation :
Screenshots
Spoiler:


Avec un second coffre, pour déposer les items non désirés, tant que l'item souhaité ne serait pas récupéré. Le coffre du dessus est posé sur un hopper, que la turtle verrouille par un signal de redstone, afin que les items retirés ne retournent pas dans les premiers slots de l'autre coffre. Lorsque l'item désiré est récupéré, il n'y a plus qu'à déverrouiller le hopper pour que le contenu regagne son coffre d'origine.
screenshots:


En interraction avec de simples computeurs, l'Inventory interface pourrait faire office de sonde, notament dans les colonnes de dropper, hopper ou coffres se déversant les uns dans les autres.
Il pourrait également servir comme d'un monayeur, adapté à n'importe quelle forme d'échange. Le nom des items renommés pourrait faire office de référence, ou de signature.

Voici plusieurs exemples de données:

Livre enchanté Looting 3 :
Code:
{
  Enchants = {},
  lifeMaxDuration = 0,
  lifeDuration = 0,
  displayName = "Enchanted Book",
  stackSize = 1,
  slot = 0,
  isItemDamaged = false,
  maxStackSize = 1,
  isStackable = false,
  metadata = 0,
  isItemEnchantable = false,
  hasDisplayName = false,
  name = "minecraft:enchanted_book",
  datatags = {
    Count = 1,
    tag = {
      StoredEnchantments = {
        {
          id = 21,
          lvl = 3,
        },
      },
    },
    Damage = 0,
    id = "minecraft:enchanted_book",
  },
  isEnchanted = false,
  repairCost = 0,
}

épée enchantée Looting 3, légèrement endommagée :
Code:
{
  Enchants = {
    {
      enchantName = "lootBonus",
      enchantLvl = 3,
    },
  },
  lifeMaxDuration = 1561,
  lifeDuration = 1559,
  displayName = "Diamond Sword",
  stackSize = 1,
  slot = 0,
  isItemDamaged = true,
  maxStackSize = 1,
  isStackable = false,
  metadata = 2,
  isItemEnchantable = false,
  hasDisplayName = false,
  name = "minecraft:diamond_sword",
  datatags = {
    Count = 1,
    tag = {
      ench = {
        {
          id = 21,
          lvl = 3,
        },
      },
      RepairCost = 1,
    },
    Damage = 2,
    id = "minecraft:diamond_sword",
  },
  isEnchanted = true,
  repairCost = 1,
}

Une page imprimée en noir, avec le texte "Hello world" :
Code:
{
  Enchants = {},
  lifeMaxDuration = 0,
  lifeDuration = 0,
  displayName = "Printed Page",
  stackSize = 1,
  slot = 0,
  isItemDamaged = false,
  maxStackSize = 1,
  isStackable = false,
  metadata = 0,
  isItemEnchantable = false,
  hasDisplayName = false,
  name = "computercraft:printout",
  datatags = {
    Count = 1,
    tag = {
      title = "test",
      line8 = "                         ",
      line11 = "                         ",
      colour14 = "fffffffffffffffffffffffff",
      colour20 = "fffffffffffffffffffffffff",
      line15 = "                         ",
      colour10 = "fffffffffffffffffffffffff",
      line14 = "                         ",
      line3 = "                         ",
      line16 = "                         ",
      line1 = "                         ",
      line18 = "                         ",
      colour0 = "fffffffffffffffffffffffff",
      colour19 = "fffffffffffffffffffffffff",
      pages = 1,
      line13 = "                         ",
      line20 = "                         ",
      colour16 = "fffffffffffffffffffffffff",
      colour8 = "fffffffffffffffffffffffff",
      colour2 = "fffffffffffffffffffffffff",
      line6 = "                         ",
      line10 = "                         ",
      colour17 = "fffffffffffffffffffffffff",
      colour9 = "fffffffffffffffffffffffff",
      colour13 = "fffffffffffffffffffffffff",
      line4 = "                         ",
      line0 = "hello world              ",
      colour11 = "fffffffffffffffffffffffff",
      colour3 = "fffffffffffffffffffffffff",
      line9 = "                         ",
      colour7 = "fffffffffffffffffffffffff",
      colour18 = "fffffffffffffffffffffffff",
      colour4 = "fffffffffffffffffffffffff",
      colour6 = "fffffffffffffffffffffffff",
      colour12 = "fffffffffffffffffffffffff",
      line7 = "                         ",
      line2 = "                         ",
      line17 = "                         ",
      colour15 = "fffffffffffffffffffffffff",
      line5 = "                         ",
      colour1 = "fffffffffffffffffffffffff",
      line19 = "                         ",
      line12 = "                         ",
      colour5 = "fffffffffffffffffffffffff",
    },
    Damage = 0,
    id = "computercraft:printout",
  },
  isEnchanted = false,
  repairCost = 0,
}

Un livre non signé : (Avec "Hello world" écrit en première page)
Code:
{
  Enchants = {},
  lifeMaxDuration = 0,
  lifeDuration = 0,
  displayName = "Book and Quill",
  stackSize = 1,
  slot = 0,
  isItemDamaged = false,
  maxStackSize = 1,
  isStackable = false,
  metadata = 0,
  isItemEnchantable = false,
  hasDisplayName = false,
  name = "minecraft:writable_book",
  datatags = {
    Count = 1,
    tag = {
      pages = {},
    },
    Damage = 0,
    id = "minecraft:writable_book",
  },
  isEnchanted = false,
  repairCost = 0,
}
Note: il semble prévu que les pages et leur contenu figure dans la table. Il y avait bien une page d'écrite dans mon test, mais elle ne figure pas dans les données retournées (vérifié sur un livre de 3 pages).

Un livre signé, et titre "Mon bouquin" : (Avec "Hello world" écrit en première page)
Code:
{
  Enchants = {},
  lifeMaxDuration = 0,
  lifeDuration = 0,
  displayName = "Mon bouquin",
  stackSize = 1,
  slot = 0,
  isItemDamaged = false,
  maxStackSize = 16,
  isStackable = true,
  metadata = 0,
  isItemEnchantable = false,
  hasDisplayName = false,
  name = "minecraft:written_book",
  datatags = {
    Count = 1,
    tag = {
      author = "SukaiPoppuGo",
      pages = {},
      title = "Mon bouquin",
    },
    Damage = 0,
    id = "minecraft:written_book",
  },
  isEnchanted = false,
  repairCost = 0,
}

à fin de test, voici le programme que j'ai utilisé. Il analyse l'objet se trouvant dans le premier slot d'un coffre, et enregistre la table retournée dans un fichier :
Code:
local s = peripheral.wrap("left")
local item = s.getItemInSlot(1)
local f = fs.open("data","w")
f.write(textutils.serialise(item))
f.close()


Dernière édition par skypop le Mar 23 Aoû - 23:05, édité 1 fois
avatar
skypop

Messages : 146
Date d'inscription : 25/07/2016

Revenir en haut Aller en bas

Re: [Life is peripheral] Inventory Interface (tuto ?)

Message par dydy70310 le Mar 23 Aoû - 22:57

Merci beaucoup a toi d'avoir fais ce tuto sur notre mod Wink
Si tu veut des source ou explication sur d'autre block envoie nous un message Wink
a moi,shira ou clem105.
Sur ce ciao et a plus en jeu.

dydy70310

Messages : 4
Date d'inscription : 05/04/2016

Revenir en haut Aller en bas

Re: [Life is peripheral] Inventory Interface (tuto ?)

Message par dydy70310 le Mar 23 Aoû - 23:06

Je fait juste quelque precision
Ca marche sur le brewing stand mais pas sur enclume et table d'enchantement
Pour ce qui est des minecart il sera possible mais pas avec l'inventoryInterface mais avec le EntityDetector
Il sera possible de scanner les turtle dans une future Maj
Ciao

dydy70310

Messages : 4
Date d'inscription : 05/04/2016

Revenir en haut Aller en bas

Re: [Life is peripheral] Inventory Interface (tuto ?)

Message par skypop le Mar 23 Aoû - 23:59

Bonne nouvelle Smile
Un autre bloc de computercraft qu'il pourrait être utile de scanner, c'est l'imprimante. Car ça permettrais de développer une imprimante couleur très fiable. En tout cas plus fiable et plus compacte que ce que j'ai pu envisager jusque là (mais j'y suis pas encore)

Pour info, au sujet de la table d'enchantement, elle est bien lue par la fonction getInventoryType() qui retourne "EnchantmentTable". Ce n'est pas le cas de l'enclume en effet.
avatar
skypop

Messages : 146
Date d'inscription : 25/07/2016

Revenir en haut Aller en bas

Re: [Life is peripheral] Inventory Interface (tuto ?)

Message par dydy70310 le Mer 24 Aoû - 13:55

Merci de ta réponse
Ca fait nous fait extremement plaisir de voir que notre travail plait au joueur Wink
J'ai deja noter l'idee d'un plus grosse imprimante mais ayant changer de pc et étant en vacance je ne peut pas developper pour le moment je m'y remet a la rentré
A+

dydy70310

Messages : 4
Date d'inscription : 05/04/2016

Revenir en haut Aller en bas

Re: [Life is peripheral] Inventory Interface (tuto ?)

Message par skypop le Mer 24 Aoû - 15:51

Juste au cas ou, je précise ma suggestion : c'est que l'Inventory Interface puisse scanner l'inventaire d'une imprimante computercraft. L'imprimante couleur, c'est juste le projet que j'ai derrière la tête (une machine à construire ingame), et qui motive cette suggestion.
avatar
skypop

Messages : 146
Date d'inscription : 25/07/2016

Revenir en haut Aller en bas

Re: [Life is peripheral] Inventory Interface (tuto ?)

Message par skypop le Ven 26 Aoû - 2:29

Je viens de remarquer que le World Interface, fait doublon aux fonctionnalités de l'Inventory Interface.
Par sa fonction getBlockInfos() qui délivre toutes les informations de n'importe quel bloc, où qu'il soit, sans contrainte... Si le bloc visé est un conteneur, on obtient toutes les données du contenu, et absolument toutes.
Ce n'est que mon avis, dans le jeu on a pas d'intérêt à utiliser l'Inventory Interface, si un seul World Interface permet de scanner tous les conteneur du monde. Il serait sans doute préférable de réduire la quantité de données renvoyées par getBlockInfos. Pourquoi pas limiter à ce que que rendre la fonction turtle.inspect().
avatar
skypop

Messages : 146
Date d'inscription : 25/07/2016

Revenir en haut Aller en bas

Re: [Life is peripheral] Inventory Interface (tuto ?)

Message par |Clem105| le Ven 26 Aoû - 18:17

Une remarque qui semble totalement justifiée, sans doute réduirons nous en effet les infos au seul nom du contenaire.

|Clem105|

Messages : 15
Date d'inscription : 07/04/2016

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum