added inventory peripheral
This commit is contained in:
parent
5f5e899f6e
commit
fe16799bbb
124
src/kernel/peripherals/Inventory.hx
Normal file
124
src/kernel/peripherals/Inventory.hx
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
package kernel.peripherals;
|
||||||
|
|
||||||
|
import lib.Item;
|
||||||
|
import cc.periphs.ItemStorage.ReducedItemInfo;
|
||||||
|
import lua.Table;
|
||||||
|
|
||||||
|
using Lambda;
|
||||||
|
|
||||||
|
class ItemInfo {
|
||||||
|
public final count:Int;
|
||||||
|
public final name:Item;
|
||||||
|
public final nbt:Null<String>;
|
||||||
|
|
||||||
|
@:allow(kernel.peripherals.Inventory)
|
||||||
|
private function new(from:ReducedItemInfo) {
|
||||||
|
this.count = from.count;
|
||||||
|
this.name = from.name;
|
||||||
|
this.nbt = from.nbt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class DetailedItemInfo extends ItemInfo {
|
||||||
|
public final displayName:String;
|
||||||
|
public final maxCount:Int;
|
||||||
|
public final tags:Array<String>;
|
||||||
|
public final durability:Null<Float>;
|
||||||
|
public final damage:Null<Int>;
|
||||||
|
public final maxDamage:Null<Int>;
|
||||||
|
public final enchantments:Array<{displayName:String, level:Int, name:String}>;
|
||||||
|
|
||||||
|
@:allow(kernel.peripherals.Inventory)
|
||||||
|
private function new(from:cc.periphs.ItemStorage.DetailedItemInfo) {
|
||||||
|
super(from);
|
||||||
|
|
||||||
|
this.tags = [];
|
||||||
|
for (k => _ in Table.toMap(from.tags)) {
|
||||||
|
this.tags.push(k);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.displayName = from.displayName;
|
||||||
|
this.maxCount = from.maxCount;
|
||||||
|
this.durability = from.durability;
|
||||||
|
this.damage = from.damage;
|
||||||
|
this.maxDamage = from.maxDamage;
|
||||||
|
|
||||||
|
if (from.enchantments != null) {
|
||||||
|
this.enchantments = from.enchantments;
|
||||||
|
} else {
|
||||||
|
this.enchantments = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Inventory implements IPeripheral {
|
||||||
|
public static inline final TYPE_NAME:String = "inventory";
|
||||||
|
|
||||||
|
private final addr:String;
|
||||||
|
private final native:cc.periphs.ItemStorage;
|
||||||
|
|
||||||
|
public function new(addr:String) {
|
||||||
|
this.addr = addr;
|
||||||
|
this.native = cc.Peripheral.wrap(addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAddr():String {
|
||||||
|
return this.addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getType():String {
|
||||||
|
return TYPE_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Get the size of this inventory.
|
||||||
|
**/
|
||||||
|
public function size():Int {
|
||||||
|
return this.native.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
List all items in this inventory.
|
||||||
|
**/
|
||||||
|
public function list():Map<Int, ItemInfo> {
|
||||||
|
var list = Table.toArray(this.native.list());
|
||||||
|
var rtn:Map<Int, ItemInfo> = new Map();
|
||||||
|
|
||||||
|
for (k => v in list) {
|
||||||
|
rtn.set(k, new ItemInfo(v));
|
||||||
|
}
|
||||||
|
|
||||||
|
return rtn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Get detailed information about an item.
|
||||||
|
**/
|
||||||
|
public function getItemDetail(slot:Int):DetailedItemInfo {
|
||||||
|
return new DetailedItemInfo(this.native.getItemDetail(slot));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Get the maximum number of items which can be stored in this slot.
|
||||||
|
Typically this will be limited to 64 items.
|
||||||
|
However, some inventorwies (such as barrels or caches) can store hundreds or thousands of items in one slot.
|
||||||
|
Keep in mind that this does not depend on that item stored in this slot.
|
||||||
|
**/
|
||||||
|
public function getItemLimit(slot:Int):Int {
|
||||||
|
return this.native.getItemLimit(slot);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Push items from one inventory to another connected one.
|
||||||
|
**/
|
||||||
|
public function pushItems(toSlot:Int, to:String, ?limit:Int, ?toSlot:Int):Int {
|
||||||
|
return this.native.pushItems(to, toSlot, limit, toSlot);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Pull items from a connected inventory into this one.
|
||||||
|
**/
|
||||||
|
public function pullItems(from:String, fromSlot:Int, ?limit:Int, ?toSlot:Int):Int {
|
||||||
|
return this.native.pullItems(from, fromSlot, limit, toSlot);
|
||||||
|
}
|
||||||
|
}
|
@ -81,6 +81,8 @@ class Peripheral {
|
|||||||
return getSpeaker(addr);
|
return getSpeaker(addr);
|
||||||
case Redstone.TYPE_NAME:
|
case Redstone.TYPE_NAME:
|
||||||
return getRedstone(addr);
|
return getRedstone(addr);
|
||||||
|
case Inventory.TYPE_NAME:
|
||||||
|
return getInventory(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
@ -167,4 +169,15 @@ class Peripheral {
|
|||||||
public static function getAllSpeakers():Array<Speaker> {
|
public static function getAllSpeakers():Array<Speaker> {
|
||||||
return [for (addr in findAddrByType(Speaker.TYPE_NAME)) new Speaker(addr)];
|
return [for (addr in findAddrByType(Speaker.TYPE_NAME)) new Speaker(addr)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function getInventory(addr:String):Null<Inventory> {
|
||||||
|
var addr = safeGetAddr(addr, Inventory.TYPE_NAME);
|
||||||
|
if (addr == null)
|
||||||
|
return null;
|
||||||
|
return new Inventory(addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getAllInventorys():Array<Inventory> {
|
||||||
|
return [for (addr in findAddrByType(Inventory.TYPE_NAME)) new Inventory(addr)];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user