diff --git a/docs/scarpet/Full.md b/docs/scarpet/Full.md index 01d76d85..f20de214 100644 --- a/docs/scarpet/Full.md +++ b/docs/scarpet/Full.md @@ -3591,6 +3591,18 @@ two arguments, keyword `'enderchest'`, followed by the player entity argument, o form: `'enderchest_steve'`. If your player name starts with enderchest, it can be always accessed by passing a player entity value. If all else fails, it will try to identify first three arguments as coordinates of a block position of a block inventory. Player inventories can also be called by their name. + +You can also use `'equipment'` as a keyword preceeding an entity indicating the need of access that entity as a mob. +Equipment inventory +consists of its armour and hand items, and a few living entites can have both, their regular inventory, and their equipment inventory. For some +entities (players) their regular inventory already contains the equipment. For entity types that only have +their equipment inventory, the equipment is returned by default. + +
+inventory_size(player()) => 41 // items
+inventory_size('enderchest', player()) => 27 // equipment
+inventory_size('equipment', player()) => 6 // equipment
+
If the entity or a block doesn't have
an inventory, they typically do nothing and return null.
@@ -3674,6 +3686,7 @@ have an inventory
inventory_size(player()) => 41
inventory_size('enderchest', player()) => 27 // enderchest
+inventory_size('equipment', player()) => 6 // equipment
inventory_size(x,y,z) => 27 // chest
inventory_size(block(pos)) => 5 // hopper
diff --git a/docs/scarpet/api/Inventories.md b/docs/scarpet/api/Inventories.md
index f72b130a..e2a68f18 100644
--- a/docs/scarpet/api/Inventories.md
+++ b/docs/scarpet/api/Inventories.md
@@ -8,6 +8,18 @@ two arguments, keyword `'enderchest'`, followed by the player entity argument, o
form: `'enderchest_steve'`. If your player name starts with enderchest, it can be always accessed by passing a player
entity value. If all else fails, it will try to identify first three arguments as coordinates of a block position of
a block inventory. Player inventories can also be called by their name.
+
+You can also use `'equipment'` as a keyword preceeding an entity indicating the need of access that entity as a mob.
+Equipment inventory
+consists of its armour and hand items, and a few living entites can have both, their regular inventory, and their equipment inventory. For some
+entities (players) their regular inventory already contains the equipment. For entity types that only have
+their equipment inventory, the equipment is returned by default.
+
+
+inventory_size(player()) => 41 // items
+inventory_size('enderchest', player()) => 27 // equipment
+inventory_size('equipment', player()) => 6 // equipment
+
If the entity or a block doesn't have
an inventory, they typically do nothing and return null.
@@ -91,6 +103,7 @@ have an inventory
inventory_size(player()) => 41
inventory_size('enderchest', player()) => 27 // enderchest
+inventory_size('equipment', player()) => 6 // equipment
inventory_size(x,y,z) => 27 // chest
inventory_size(block(pos)) => 5 // hopper
diff --git a/src/main/java/carpet/fakes/InventoryBearerInterface.java b/src/main/java/carpet/fakes/InventoryBearerInterface.java
new file mode 100644
index 00000000..aa282382
--- /dev/null
+++ b/src/main/java/carpet/fakes/InventoryBearerInterface.java
@@ -0,0 +1,8 @@
+package carpet.fakes;
+
+import net.minecraft.inventory.Inventory;
+
+public interface InventoryBearerInterface
+{
+ Inventory getCMInventory();
+}
diff --git a/src/main/java/carpet/mixins/HorseBaseEntity_scarpetMixin.java b/src/main/java/carpet/mixins/HorseBaseEntity_scarpetMixin.java
new file mode 100644
index 00000000..dc08d54d
--- /dev/null
+++ b/src/main/java/carpet/mixins/HorseBaseEntity_scarpetMixin.java
@@ -0,0 +1,21 @@
+package carpet.mixins;
+
+import carpet.fakes.InventoryBearerInterface;
+import net.minecraft.entity.passive.HorseBaseEntity;
+import net.minecraft.inventory.Inventory;
+import net.minecraft.inventory.SimpleInventory;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+
+@Mixin(HorseBaseEntity.class)
+public class HorseBaseEntity_scarpetMixin implements InventoryBearerInterface
+{
+
+ @Shadow protected SimpleInventory items;
+
+ @Override
+ public Inventory getCMInventory()
+ {
+ return items;
+ }
+}
diff --git a/src/main/java/carpet/mixins/PillagerEntity_scarpetMixin.java b/src/main/java/carpet/mixins/PillagerEntity_scarpetMixin.java
new file mode 100644
index 00000000..66db248f
--- /dev/null
+++ b/src/main/java/carpet/mixins/PillagerEntity_scarpetMixin.java
@@ -0,0 +1,21 @@
+package carpet.mixins;
+
+import carpet.fakes.InventoryBearerInterface;
+import net.minecraft.entity.mob.PillagerEntity;
+import net.minecraft.inventory.Inventory;
+import net.minecraft.inventory.SimpleInventory;
+import org.spongepowered.asm.mixin.Final;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+
+@Mixin(PillagerEntity.class)
+public class PillagerEntity_scarpetMixin implements InventoryBearerInterface
+{
+ @Shadow @Final private SimpleInventory inventory;
+
+ @Override
+ public Inventory getCMInventory()
+ {
+ return inventory;
+ }
+}
diff --git a/src/main/java/carpet/script/utils/LivingInventory.java b/src/main/java/carpet/script/utils/LivingInventory.java
new file mode 100644
index 00000000..34c563cd
--- /dev/null
+++ b/src/main/java/carpet/script/utils/LivingInventory.java
@@ -0,0 +1,96 @@
+package carpet.script.utils;
+
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+import net.minecraft.entity.EquipmentSlot;
+import net.minecraft.entity.LivingEntity;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.inventory.Inventory;
+import net.minecraft.item.ItemStack;
+
+public class LivingInventory implements Inventory
+{
+ private static final Int2ObjectMap