semi working fabric inventories

This commit is contained in:
dfsek
2021-02-23 22:33:08 -07:00
parent df2acfaa40
commit 4171768cc9
11 changed files with 134 additions and 9 deletions

View File

@@ -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);

View File

@@ -25,5 +25,6 @@ public class BufferedLootApplication implements BufferedItem {
}
Container container = (Container) data;
table.fillInventory(container.getInventory(), new FastRandom(origin.hashCode()));
data.update(false);
}
}

View File

@@ -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<Biome> biomeRegistry, Registry<ChunkGeneratorSettings> chunkGeneratorSettingsRegistry, long seed) {
ConfigPack pack = registry.get("DEFAULT");

View File

@@ -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));
}
}

View File

@@ -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();
}
}

View File

@@ -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

View File

@@ -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;
}
}

View File

@@ -8,8 +8,8 @@ import java.util.List;
@Mixin(GeneratorType.class)
public interface GeneratorTypeAccessor {
@Accessor("VALUES")
static List<GeneratorType> getValues() {
@Accessor
static List<GeneratorType> getVALUES() {
throw new AssertionError();
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -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));
}
}