From 4171768cc9f7950b3e579db12599eafc0b0ca2ba Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 23 Feb 2021 22:33:08 -0700 Subject: [PATCH] semi working fabric inventories --- .../terra/api/structures/loot/LootTable.java | 1 + .../buffer/items/BufferedLootApplication.java | 1 + .../dfsek/terra/fabric/TerraFabricPlugin.java | 2 +- .../fabric/inventory/FabricInventory.java | 39 +++++++++++++++++++ .../terra/fabric/inventory/FabricItem.java | 27 +++++++++++++ .../fabric/inventory/FabricItemHandle.java | 10 ++++- .../fabric/inventory/FabricItemStack.java | 18 +++++++-- .../fabric/mixin/GeneratorTypeAccessor.java | 4 +- .../terra/fabric/world/FabricAdapter.java | 15 +++++++ .../world/block/state/FabricBlockState.java | 7 +++- .../world/block/state/FabricContainer.java | 19 +++++++++ 11 files changed, 134 insertions(+), 9 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricInventory.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItem.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricContainer.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/loot/LootTable.java b/common/src/main/java/com/dfsek/terra/api/structures/loot/LootTable.java index f5da89b65..163984c90 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/loot/LootTable.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/loot/LootTable.java @@ -62,6 +62,7 @@ public class LootTable { newStack.setAmount(1); int slot = r.nextInt(i.getSize()); ItemStack slotItem = i.getItem(slot); + System.out.println("attempt: " + (slotItem == null ? null : slotItem.getHandle())); if(slotItem == null) { i.setItem(slot, newStack); stack.setAmount(stack.getAmount() - 1); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java index 34ef61853..403c7f40c 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java @@ -25,5 +25,6 @@ public class BufferedLootApplication implements BufferedItem { } Container container = (Container) data; table.fillInventory(container.getInventory(), new FastRandom(origin.hashCode())); + data.update(false); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 8dc0a1c06..41291e2e1 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -286,7 +286,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { Registry.register(Registry.BIOME_SOURCE, new Identifier("terra:terra"), TerraBiomeSource.CODEC); if(FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { - GeneratorTypeAccessor.getValues().add(new GeneratorType("terra") { + GeneratorTypeAccessor.getVALUES().add(new GeneratorType("terra") { @Override protected ChunkGenerator getChunkGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed) { ConfigPack pack = registry.get("DEFAULT"); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricInventory.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricInventory.java new file mode 100644 index 000000000..140964686 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricInventory.java @@ -0,0 +1,39 @@ +package com.dfsek.terra.fabric.inventory; + +import com.dfsek.terra.api.platform.inventory.Inventory; +import com.dfsek.terra.api.platform.inventory.ItemStack; +import com.dfsek.terra.fabric.world.FabricAdapter; +import net.minecraft.block.entity.LootableContainerBlockEntity; +import net.minecraft.item.Items; + +public class FabricInventory implements Inventory { + private final LootableContainerBlockEntity delegate; + + public FabricInventory(LootableContainerBlockEntity delegate) { + this.delegate = delegate; + } + + @Override + public net.minecraft.inventory.Inventory getHandle() { + return delegate; + } + + @Override + public int getSize() { + return delegate.size(); + } + + @Override + public ItemStack getItem(int slot) { + net.minecraft.item.ItemStack itemStack = delegate.getStack(slot); + System.out.println("item @ " + slot + " GET: " + itemStack); + return itemStack.getItem() == Items.AIR ? null : FabricAdapter.adapt(itemStack); + } + + @Override + public void setItem(int slot, ItemStack newStack) { + System.out.println("item @ " + slot + ": " + newStack.getHandle()); + delegate.setStack(slot, FabricAdapter.adapt(newStack)); + + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItem.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItem.java new file mode 100644 index 000000000..40c683119 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItem.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.fabric.inventory; + +import com.dfsek.terra.api.platform.inventory.Item; +import com.dfsek.terra.api.platform.inventory.ItemStack; + +public class FabricItem implements Item { + private final net.minecraft.item.Item delegate; + + public FabricItem(net.minecraft.item.Item delegate) { + this.delegate = delegate; + } + + @Override + public net.minecraft.item.Item getHandle() { + return delegate; + } + + @Override + public ItemStack newItemStack(int amount) { + return new FabricItemStack(new net.minecraft.item.ItemStack(delegate, amount)); + } + + @Override + public double getMaxDurability() { + return delegate.getMaxDamage(); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java index d487bd719..3900a67e7 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java @@ -3,6 +3,10 @@ package com.dfsek.terra.fabric.inventory; import com.dfsek.terra.api.platform.handle.ItemHandle; import com.dfsek.terra.api.platform.inventory.Item; import com.dfsek.terra.api.platform.inventory.item.Enchantment; +import com.dfsek.terra.fabric.world.FabricAdapter; +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.command.argument.ItemStackArgumentType; import java.util.Collections; import java.util.Set; @@ -11,7 +15,11 @@ public class FabricItemHandle implements ItemHandle { @Override public Item createItem(String data) { - return null; + try { + return FabricAdapter.adapt(new ItemStackArgumentType().parse(new StringReader(data)).getItem()); + } catch(CommandSyntaxException e) { + throw new IllegalArgumentException("Invalid item data \"" + data + "\"", e); + } } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java index 1db90510e..f5c414d2b 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java @@ -5,7 +5,11 @@ import com.dfsek.terra.api.platform.inventory.ItemStack; import com.dfsek.terra.api.platform.inventory.item.ItemMeta; public class FabricItemStack implements ItemStack { - net.minecraft.item.ItemStack delegate; + private net.minecraft.item.ItemStack delegate; + + public FabricItemStack(net.minecraft.item.ItemStack delegate) { + this.delegate = delegate; + } @Override public int getAmount() { @@ -19,12 +23,18 @@ public class FabricItemStack implements ItemStack { @Override public Item getType() { - return null; + return new FabricItem(delegate.getItem()); } @Override public ItemStack clone() { - return null; + try { + FabricItemStack stack = (FabricItemStack) super.clone(); + stack.delegate = delegate; + return stack; + } catch(CloneNotSupportedException e) { + throw new Error(); + } } @Override @@ -38,7 +48,7 @@ public class FabricItemStack implements ItemStack { } @Override - public Object getHandle() { + public net.minecraft.item.ItemStack getHandle() { return delegate; } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorTypeAccessor.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorTypeAccessor.java index e251ebd59..707ad6f1e 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorTypeAccessor.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorTypeAccessor.java @@ -8,8 +8,8 @@ import java.util.List; @Mixin(GeneratorType.class) public interface GeneratorTypeAccessor { - @Accessor("VALUES") - static List getValues() { + @Accessor + static List getVALUES() { throw new AssertionError(); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java index 0c2b5857b..b6105f262 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java @@ -3,6 +3,8 @@ package com.dfsek.terra.fabric.world; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.block.BlockType; import com.dfsek.terra.api.platform.entity.EntityType; +import com.dfsek.terra.fabric.inventory.FabricItem; +import com.dfsek.terra.fabric.inventory.FabricItemStack; import com.dfsek.terra.fabric.world.block.FabricBlockData; import com.dfsek.terra.fabric.world.block.FabricBlockType; import com.dfsek.terra.fabric.world.block.data.FabricMultipleFacing; @@ -14,6 +16,8 @@ import com.dfsek.terra.fabric.world.entity.FabricEntityType; import com.dfsek.terra.fabric.world.handles.world.FabricWorldHandle; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.state.property.Properties; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldAccess; @@ -58,4 +62,15 @@ public final class FabricAdapter { return ((FabricEntityType) entityType).getHandle(); } + public static ItemStack adapt(com.dfsek.terra.api.platform.inventory.ItemStack itemStack) { + return ((FabricItemStack) itemStack).getHandle(); + } + + public static com.dfsek.terra.api.platform.inventory.ItemStack adapt(ItemStack itemStack) { + return new FabricItemStack(itemStack); + } + + public static com.dfsek.terra.api.platform.inventory.Item adapt(Item item) { + return new FabricItem(item); + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java index 24ede5b8f..333c7cde5 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java @@ -7,6 +7,7 @@ import com.dfsek.terra.fabric.world.FabricAdapter; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.block.FabricBlockData; import com.dfsek.terra.fabric.world.handles.world.FabricWorldHandle; +import net.minecraft.block.AbstractChestBlock; import net.minecraft.block.AbstractSignBlock; import net.minecraft.block.SpawnerBlock; import net.minecraft.block.entity.BlockEntity; @@ -33,6 +34,10 @@ public class FabricBlockState implements BlockState { } else if(block1 instanceof SpawnerBlock) { MobSpawnerBlockEntity mobSpawnerBlockEntity = (MobSpawnerBlockEntity) worldAccess.getBlockEntity(FabricAdapter.adapt(block.getLocation().toVector())); return new FabricMobSpawner(mobSpawnerBlockEntity, worldAccess); + } else if(block1 instanceof AbstractChestBlock) { + BlockEntity abstractChestBlock = worldAccess.getBlockEntity(FabricAdapter.adapt(block.getLocation().toVector())); + System.out.println("inventory: " + block1); + return new FabricContainer(abstractChestBlock, worldAccess); } return null; } @@ -69,7 +74,7 @@ public class FabricBlockState implements BlockState { @Override public boolean update(boolean applyPhysics) { - (worldAccess).getChunk(blockEntity.getPos()).setBlockEntity(blockEntity.getPos(), blockEntity); + worldAccess.getChunk(blockEntity.getPos()).setBlockEntity(blockEntity.getPos(), blockEntity); return true; } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricContainer.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricContainer.java new file mode 100644 index 000000000..bca4f2dc0 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricContainer.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.fabric.world.block.state; + +import com.dfsek.terra.api.platform.block.state.Container; +import com.dfsek.terra.api.platform.inventory.Inventory; +import com.dfsek.terra.fabric.inventory.FabricInventory; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.block.entity.LootableContainerBlockEntity; +import net.minecraft.world.WorldAccess; + +public class FabricContainer extends FabricBlockState implements Container { + public FabricContainer(BlockEntity blockEntity, WorldAccess worldAccess) { + super(blockEntity, worldAccess); + } + + @Override + public Inventory getInventory() { + return new FabricInventory(((LootableContainerBlockEntity) blockEntity)); + } +}