diff --git a/src/main/java/net/halbear/aotg/AgeoftheGods.java b/src/main/java/net/halbear/aotg/AgeoftheGods.java index ce0eb21..00ecc3a 100644 --- a/src/main/java/net/halbear/aotg/AgeoftheGods.java +++ b/src/main/java/net/halbear/aotg/AgeoftheGods.java @@ -52,6 +52,7 @@ import static net.halbear.aotg.registries.ModBlockEntities.BLOCK_ENTITY_TYPES; import static net.halbear.aotg.registries.ModBlocks.*; import static net.halbear.aotg.registries.ModFoliagePlacers.FOLIAGE_PLACERS; import static net.halbear.aotg.registries.ModItems.*; +import static net.halbear.aotg.registries.ModTabs.CREATIVE_MODE_TABS; import static net.halbear.aotg.registries.ModTreeGen.TRUNK_PLACERS; // The value here should match an entry in the META-INF/neoforge.mods.toml file @@ -62,24 +63,6 @@ public class AgeoftheGods { public static final Logger LOGGER = LogUtils.getLogger(); - public static final DeferredRegister CREATIVE_MODE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, MODID); - - - public static final DeferredHolder AGE_OF_THE_GODS_TAB = CREATIVE_MODE_TABS.register("age_of_the_gods", () -> CreativeModeTab.builder() - .title(Component.translatable("itemGroup.ageofthegods")) //The language key for the title of your CreativeModeTab - .withTabsBefore(CreativeModeTabs.COMBAT) - .icon(() -> LIMESTONE_BLOCK.get().asItem().getDefaultInstance()) - .displayItems((parameters, output) -> { - output.accept(LIMESTONE_ITEM.get()); - output.accept(SHALE_ITEM.get()); - output.accept(SHALE_GRASS_ITEM.get()); - output.accept(LIMESTONE_GRASS_ITEM.get()); - output.accept(OLIVE_LEAVES_ITEM.get()); - output.accept(OLIVE_LOG_ITEM.get()); - output.accept(XIPHOS_SWORD.get()); - output.accept(ALLOY_FURNACE_ITEM.get()); - }).build()); - // The constructor for the mod class is the first code that is run when your mod is loaded. // FML will recognize some parameter types like IEventBus or ModContainer and pass them in automatically. public AgeoftheGods(IEventBus modEventBus, ModContainer modContainer) { diff --git a/src/main/java/net/halbear/aotg/custom/GuiScreens/AlloyFurnaceGUIScreen.java b/src/main/java/net/halbear/aotg/custom/GuiScreens/AlloyFurnaceGUIScreen.java index d076fb2..8a97872 100644 --- a/src/main/java/net/halbear/aotg/custom/GuiScreens/AlloyFurnaceGUIScreen.java +++ b/src/main/java/net/halbear/aotg/custom/GuiScreens/AlloyFurnaceGUIScreen.java @@ -76,7 +76,7 @@ public class AlloyFurnaceGUIScreen extends AbstractContainerScreen implements ModScreens.ScreenAccessor { + private final Level world; + private final int x, y, z; + private final Player entity; + private boolean menuStateUpdateActive = false; + private ImageButton Blower; + private static final Identifier BACKGROUND = Identifier.parse("ageofthegods:textures/screens/alloy_furnace_gui.png"); + private static final Identifier BELLOW_SPRITE_SHEET = Identifier.parse("ageofthegods:textures/screens/bellow-sheet.png"); + private static final Identifier MOLTEN_FILL_SPRITE = Identifier.parse("ageofthegods:textures/screens/alloy_furnace_molten_element_gui.png"); + private static final Identifier FLAME_SPRITE = Identifier.parse("ageofthegods:textures/screens/alloy_furnace_flame_gui.png"); + + + public ForgeWorkbenchGUIScreen(ForgeWorkbenchGUI container, Inventory inventory, Component text) { + super(container, inventory, text, 176, 166); + this.world = container.world; + this.x = container.x; + this.y = container.y; + this.z = container.z; + this.entity = container.entity; + } + + @Override + public void updateMenuState(int elementType, String name, Object elementState) { + menuStateUpdateActive = false; + } + + @Override + public void extractRenderState(GuiGraphicsExtractor guiGraphics, int mouseX, int mouseY, float partialTicks) { + super.extractRenderState(guiGraphics, mouseX, mouseY, partialTicks); + } + + @Override + public void extractBackground(GuiGraphicsExtractor guiGraphics, int mouseX, int mouseY, float partialTicks) { + super.extractBackground(guiGraphics, mouseX, mouseY, partialTicks); + guiGraphics.blit(RenderPipelines.GUI_TEXTURED, BACKGROUND, this.leftPos, this.topPos, 0, 0, this.imageWidth, this.imageHeight, this.imageWidth, this.imageHeight); + } + + @Override + public boolean keyPressed(KeyEvent event) { + int key = InputConstants.getKey(event).getValue(); + if (key == 256) { + this.minecraft.player.closeContainer(); + return true; + } + return super.keyPressed(event); + } + + @Override + protected void extractLabels(GuiGraphicsExtractor guiGraphics, int mouseX, int mouseY) { + guiGraphics.text(this.font, Component.translatable("gui.ageofthegods.forge_workbench.title"), 90, 6, -12829636, false); + } + + @Override + public void init() { + super.init(); + + } +} diff --git a/src/main/java/net/halbear/aotg/custom/blocks/Forge/ForgeWorkbench.java b/src/main/java/net/halbear/aotg/custom/blocks/Forge/ForgeWorkbench.java new file mode 100644 index 0000000..0b06116 --- /dev/null +++ b/src/main/java/net/halbear/aotg/custom/blocks/Forge/ForgeWorkbench.java @@ -0,0 +1,104 @@ +package net.halbear.aotg.custom.blocks.Forge; + +import io.netty.buffer.Unpooled; +import net.halbear.aotg.registries.ModBlocks; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Containers; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.phys.BlockHitResult; +import org.jspecify.annotations.Nullable; + +import static net.halbear.aotg.registries.ModBlockEntities.ALLOY_FURNACE_BLOCK_ENTITY; +import static net.halbear.aotg.registries.ModBlockEntities.FORGE_WORKBENCH_BLOCK_ENTITY; + +public class ForgeWorkbench extends Block implements EntityBlock { + + public static final BlockPos[] MULTI_BLOCK_POSITIONS = { + + }; + + public static final EnumProperty FACING = BlockStateProperties.HORIZONTAL_FACING; + public static final IntegerProperty LEVEL = IntegerProperty.create("level",0,8); + + public ForgeWorkbench(Properties properties) { + super(properties); + this.registerDefaultState(this.defaultBlockState().setValue(LEVEL,0).setValue(FACING,Direction.NORTH)); + } + + @Override + protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + Containers.updateNeighboursAfterDestroy(state, level, pos); + } + + private static @javax.annotation.Nullable BlockEntityTicker createTickerHelper( + BlockEntityType type, BlockEntityType checkedType, BlockEntityTicker ticker + ) { + return checkedType == type ? (BlockEntityTicker) ticker : null; + } + + @Override + public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type) { + return createTickerHelper(type, FORGE_WORKBENCH_BLOCK_ENTITY.get(), ForgeWorkbenchBlockEntity::tick); + } + + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + BlockState blockState = this.defaultBlockState(); + blockState = blockState.setValue(FACING, context.getHorizontalDirection().getOpposite()); + return blockState; + } + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder){ + builder.add(LEVEL); + builder.add(FACING); + } + + @Override + public InteractionResult useWithoutItem(BlockState blockstate, Level world, BlockPos pos, Player entity, BlockHitResult hit) { + super.useWithoutItem(blockstate, world, pos, entity, hit); + if (entity instanceof ServerPlayer player) { + if(!blockstate.getBlock().getName().getString().equals(ModBlocks.FORGE_WORKBENCH.get().getName().getString()) || pos == null) return InteractionResult.PASS; + int level = blockstate.getValue(LEVEL); + player.openMenu(new MenuProvider() { + @Override + public Component getDisplayName() { + return Component.literal("Sigma"); + } + + @Override + public AbstractContainerMenu createMenu(int id, Inventory inventory, Player player) { + return new ForgeWorkbenchGUI(id, inventory, new FriendlyByteBuf(Unpooled.buffer()).writeBlockPos(pos)); + } + }, pos); + } + return InteractionResult.SUCCESS; + } + + + @Override + public @Nullable BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { + return new ForgeWorkbenchBlockEntity(blockPos,blockState); + } +} \ No newline at end of file diff --git a/src/main/java/net/halbear/aotg/custom/blocks/Forge/ForgeWorkbenchBlockEntity.java b/src/main/java/net/halbear/aotg/custom/blocks/Forge/ForgeWorkbenchBlockEntity.java new file mode 100644 index 0000000..a9fd56a --- /dev/null +++ b/src/main/java/net/halbear/aotg/custom/blocks/Forge/ForgeWorkbenchBlockEntity.java @@ -0,0 +1,177 @@ +package net.halbear.aotg.custom.blocks.Forge; + +import io.netty.buffer.Unpooled; +import net.halbear.aotg.registries.ModBlocks; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.Connection; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.world.ContainerHelper; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.WorldlyContainer; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.ValueInput; +import net.minecraft.world.level.storage.ValueOutput; +import net.neoforged.neoforge.transfer.StacksResourceHandler; +import net.neoforged.neoforge.transfer.item.ItemResource; +import net.neoforged.neoforge.transfer.item.ItemStacksResourceHandler; +import org.jspecify.annotations.Nullable; + +import java.util.stream.IntStream; + +import static net.halbear.aotg.registries.ModBlockEntities.FORGE_WORKBENCH_BLOCK_ENTITY; + +public class ForgeWorkbenchBlockEntity extends RandomizableContainerBlockEntity implements MenuProvider, WorldlyContainer { + + private int ForgeLevel = 0; + private NonNullList items = NonNullList.withSize(3, ItemStack.EMPTY); + + public int GetForgeLevel(){return (int)ForgeLevel;} + public void SetForgeLevel(int BellowPush){this.ForgeLevel = BellowPush ;} + + public ForgeWorkbenchBlockEntity(BlockPos worldPosition, BlockState blockState) { + super(FORGE_WORKBENCH_BLOCK_ENTITY.get(), worldPosition, blockState); + } + + + public static void tick(Level level, BlockPos pos, BlockState state, ForgeWorkbenchBlockEntity blockEntity) { + if (level.isClientSide()) return; + blockEntity.setChanged(); + } + + @Override + public void loadAdditional(ValueInput input) { + super.loadAdditional(input); + if (!this.tryLoadLootTable(input)) + this.items = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); + ContainerHelper.loadAllItems(input, this.items); + this.ForgeLevel = input.getIntOr("forge_level",0); + } + + @Override + public void saveAdditional(ValueOutput output) { + super.saveAdditional(output); + output.putInt("forge_level", this.ForgeLevel); + if (!this.trySaveLootTable(output)) + ContainerHelper.saveAllItems(output, this.items); + + } + + @Override + public CompoundTag getUpdateTag(HolderLookup.Provider registries) { + return this.saveWithFullMetadata(registries); + } + + @Override + public void handleUpdateTag(ValueInput input) { + super.handleUpdateTag(input); + } + + + @Override + public Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + @Override + public void onDataPacket(Connection connection, ValueInput input) { + super.onDataPacket(connection, input); + } + + @Override + public Component getDisplayName() { + return Component.translatable("container.ageofthegods.forge"); + } + + @Override + protected Component getDefaultName() { + return null; + } + + @Override + public @Nullable AbstractContainerMenu createMenu(int i, Inventory inventory, Player player) { + return new ForgeWorkbenchGUI(i, inventory, new FriendlyByteBuf(Unpooled.buffer()).writeBlockPos(this.worldPosition)); + + } + + @Override + protected AbstractContainerMenu createMenu(int i, Inventory inventory) { + return new ForgeWorkbenchGUI(i, inventory, new FriendlyByteBuf(Unpooled.buffer()).writeBlockPos(this.worldPosition)); + } + + private final StacksResourceHandler resourceHandler = new ItemStacksResourceHandler(this.items) { + @Override + protected void onContentsChanged(int index, ItemStack stack) { + super.onContentsChanged(index, stack); + setChanged(); + } + }; + + public StacksResourceHandler getResourceHandler() { + return this.resourceHandler; + } + + + @Override + public int getContainerSize() { + return items.size(); + } + + @Override + public boolean isEmpty() { + for (ItemStack itemstack : this.items) + if (!itemstack.isEmpty()) + return false; + return true; + } + + @Override + protected NonNullList getItems() { + return this.items; + } + + @Override + protected void setItems(NonNullList stacks) { + this.items = stacks; + } + + @Override + public boolean canPlaceItem(int index, ItemStack stack) { + return true; + } + + @Override + public int[] getSlotsForFace(Direction side) { + return IntStream.range(0, this.getContainerSize()).toArray(); + } + + @Override + public boolean canPlaceItemThroughFace(int index, ItemStack itemstack, @Nullable Direction direction) { + return this.canPlaceItem(index, itemstack); + } + + @Override + public boolean canTakeItemThroughFace(int index, ItemStack itemstack, Direction direction) { + return true; + } + + @Override + public void clearContent() { + items.clear(); + } +} diff --git a/src/main/java/net/halbear/aotg/custom/blocks/Forge/ForgeWorkbenchGUI.java b/src/main/java/net/halbear/aotg/custom/blocks/Forge/ForgeWorkbenchGUI.java new file mode 100644 index 0000000..31ca700 --- /dev/null +++ b/src/main/java/net/halbear/aotg/custom/blocks/Forge/ForgeWorkbenchGUI.java @@ -0,0 +1,274 @@ +package net.halbear.aotg.custom.blocks.Forge; + +import net.halbear.aotg.registries.ModMenus; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ContainerData; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BaseContainerBlockEntity; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.neoforged.neoforge.transfer.ResourceHandler; +import net.neoforged.neoforge.transfer.item.*; +import net.neoforged.neoforge.transfer.transaction.Transaction; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + +public class ForgeWorkbenchGUI extends AbstractContainerMenu implements ModMenus.MenuAccessor { + public final Map menuState = new HashMap<>() { + @Override + public Object put(String key, Object value) { + if (!this.containsKey(key) && this.size() >= 5) + return null; + return super.put(key, value); + } + }; + public final Level world; + public final Player entity; + public int x, y, z; + private ContainerLevelAccess access = ContainerLevelAccess.NULL; + private ResourceHandler internal; + private final Map customSlots = new HashMap<>(); + private boolean bound = false; + private Supplier boundItemMatcher = null; + private BlockEntity boundBlockEntity = null; + private final ContainerData data; + + + + public ForgeWorkbenchGUI(int containerId, Inventory playerInv, FriendlyByteBuf buffer) { + super(ModMenus.FORGE_WORKBENCH_GUI.get(), containerId); + this.entity = playerInv.player; + this.world = playerInv.player.level(); + this.internal = new ItemStacksResourceHandler(4); + + BlockPos pos = null; + if (buffer != null) { + pos = buffer.readBlockPos(); + this.x = pos.getX(); + this.y = pos.getY(); + this.z = pos.getZ(); + access = ContainerLevelAccess.create(world, pos); + } + + if (pos != null) { + boundBlockEntity = this.world.getBlockEntity(pos); + if (boundBlockEntity instanceof BaseContainerBlockEntity baseContainerBlockEntity) { + this.internal = VanillaContainerWrapper.of(baseContainerBlockEntity); + this.bound = true; + } + } + this.customSlots.put(0, this.addSlot(new ResourceHandlerSlot(internal, this::setItemInSlot, 0, 37, 16) { + private final int slot = 0; + private int x = this.x; + private int y = this.y; + })); + + + for (int row = 0; row < 3; ++row) { + for (int col = 0; col < 9; ++col) { + this.addSlot(new Slot(playerInv, col + row * 9 + 9, 8 + col * 18, 84 + row * 18)); + } + } + + for (int col = 0; col < 9; ++col) { + this.addSlot(new Slot(playerInv, col, 8 + col * 18, 142)); + } + if (boundBlockEntity instanceof ForgeWorkbenchBlockEntity workbenchBlockEntity) { + this.data = new ContainerData() { + @Override + public int get(int index) { + int returnVal = 0; + switch (index) { + case 0: + returnVal = workbenchBlockEntity.GetForgeLevel(); + break; + } + return returnVal; + } + + @Override + public void set(int index, int value) { + switch(index) { + case 0: + workbenchBlockEntity.SetForgeLevel(value); + break; + } + } + + @Override + public int getCount() { + return 4; + } + }; + + this.addDataSlots(this.data); + } else this.data = null; + } + + public int getSyncedVariable(int index) { + return this.data.get(index); + } + + private void setItemInSlot(int index, ItemResource resource, int amount) { + if (internal instanceof ItemStacksResourceHandler handler) { + handler.set(index, resource, amount); + } else if (boundBlockEntity instanceof Container container) { + container.setItem(index, resource.toStack(Math.max(0, amount))); + } else { + try (var tx = Transaction.openRoot()) { + if (!internal.getResource(index).isEmpty()) + internal.extract(index, internal.getResource(index), internal.getAmountAsInt(index), tx); + if (!resource.isEmpty() && amount > 0) + internal.insert(index, resource, amount, tx); + tx.commit(); + } + } + } + + + + + @Override + public boolean stillValid(Player player) { + if (this.bound) { + if (this.boundItemMatcher != null) + return this.boundItemMatcher.get(); + else if (this.boundBlockEntity != null) + return AbstractContainerMenu.stillValid(this.access, player, this.boundBlockEntity.getBlockState().getBlock()); + } + return true; + } + + @Override + public ItemStack quickMoveStack(Player playerIn, int index) { + ItemStack itemstack = ItemStack.EMPTY; + Slot slot = this.slots.get(index); + if (slot != null && slot.hasItem()) { + ItemStack itemstack1 = slot.getItem(); + itemstack = itemstack1.copy(); + if (index < 4) { + if (!this.moveItemStackTo(itemstack1, 4, this.slots.size(), true)) + return ItemStack.EMPTY; + slot.onQuickCraft(itemstack1, itemstack); + } else if (!this.moveItemStackTo(itemstack1, 0, 4, false)) { + if (index < 4 + 27) { + if (!this.moveItemStackTo(itemstack1, 4 + 27, this.slots.size(), true)) + return ItemStack.EMPTY; + } else { + if (!this.moveItemStackTo(itemstack1, 4, 4 + 27, false)) + return ItemStack.EMPTY; + } + return ItemStack.EMPTY; + } + if (itemstack1.isEmpty()) { + slot.setByPlayer(ItemStack.EMPTY); + } else { + slot.setChanged(); + } + if (itemstack1.getCount() == itemstack.getCount()) { + return ItemStack.EMPTY; + } + slot.onTake(playerIn, itemstack1); + } + return itemstack; + } + + @Override + protected boolean moveItemStackTo(ItemStack itemStack, int startSlot, int endSlot, boolean backwards) { + boolean anythingChanged = false; + int destSlot = startSlot; + if (backwards) { + destSlot = endSlot - 1; + } + if (itemStack.isStackable()) { + while (!itemStack.isEmpty() && (backwards ? destSlot >= startSlot : destSlot < endSlot)) { + Slot slot = this.slots.get(destSlot); + ItemStack target = slot.getItem(); + if (slot.mayPlace(target) && !target.isEmpty() && ItemStack.isSameItemSameComponents(itemStack, target)) { + int totalStack = target.getCount() + itemStack.getCount(); + int maxStackSize = slot.getMaxStackSize(target); + if (totalStack <= maxStackSize) { + itemStack.setCount(0); + target.setCount(totalStack); + slot.set(target); + anythingChanged = true; + } else if (target.getCount() < maxStackSize) { + itemStack.shrink(maxStackSize - target.getCount()); + target.setCount(maxStackSize); + slot.set(target); + anythingChanged = true; + } + } + if (backwards) { + destSlot--; + } else { + destSlot++; + } + } + } + if (!itemStack.isEmpty()) { + if (backwards) { + destSlot = endSlot - 1; + } else { + destSlot = startSlot; + } + while (backwards ? destSlot >= startSlot : destSlot < endSlot) { + Slot slotx = this.slots.get(destSlot); + ItemStack targetx = slotx.getItem(); + if (targetx.isEmpty() && slotx.mayPlace(itemStack)) { + int maxStackSize = slotx.getMaxStackSize(itemStack); + slotx.setByPlayer(itemStack.split(Math.min(itemStack.getCount(), maxStackSize))); + slotx.setChanged(); + anythingChanged = true; + break; + } + if (backwards) { + destSlot--; + } else { + destSlot++; + } + } + } + return anythingChanged; + } + + @Override + public void removed(Player playerIn) { + super.removed(playerIn); + if (!bound && playerIn instanceof ServerPlayer serverPlayer) { + if (!serverPlayer.isAlive() || serverPlayer.hasDisconnected()) { + for (int j = 0; j < internal.size(); ++j) { + playerIn.drop(ItemUtil.getStack(internal, j), false); + setItemInSlot(j, ItemResource.EMPTY, 0); + } + } else { + for (int i = 0; i < internal.size(); ++i) { + playerIn.getInventory().placeItemBackInInventory(ItemUtil.getStack(internal, i)); + setItemInSlot(i, ItemResource.EMPTY, 0); + } + } + } + } + + @Override + public Map getSlots() { + return Collections.unmodifiableMap(customSlots); + } + + @Override + public Map getMenuState() { + return menuState; + } + +} diff --git a/src/main/java/net/halbear/aotg/registries/ModBlockEntities.java b/src/main/java/net/halbear/aotg/registries/ModBlockEntities.java index 709129e..b8636b4 100644 --- a/src/main/java/net/halbear/aotg/registries/ModBlockEntities.java +++ b/src/main/java/net/halbear/aotg/registries/ModBlockEntities.java @@ -2,6 +2,7 @@ package net.halbear.aotg.registries; import net.halbear.aotg.AgeoftheGods; import net.halbear.aotg.custom.blocks.AlloyFurnace.AlloyFurnaceBlockEntity; +import net.halbear.aotg.custom.blocks.Forge.ForgeWorkbenchBlockEntity; import net.minecraft.core.registries.Registries; import net.minecraft.world.level.block.entity.BlockEntityType; import net.neoforged.neoforge.registries.DeferredRegister; @@ -20,5 +21,12 @@ public class ModBlockEntities { ModBlocks.ALLOY_FURNACE.get() ) ); - + public static final Supplier> FORGE_WORKBENCH_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register( + "forge_workbench_block_entity", + () -> new BlockEntityType<>( + ForgeWorkbenchBlockEntity::new, + false, + ModBlocks.FORGE_WORKBENCH.get() + ) + ); } diff --git a/src/main/java/net/halbear/aotg/registries/ModBlocks.java b/src/main/java/net/halbear/aotg/registries/ModBlocks.java index 1998b8c..ac6701b 100644 --- a/src/main/java/net/halbear/aotg/registries/ModBlocks.java +++ b/src/main/java/net/halbear/aotg/registries/ModBlocks.java @@ -2,6 +2,7 @@ package net.halbear.aotg.registries; import net.halbear.aotg.AgeoftheGods; import net.halbear.aotg.custom.blocks.AlloyFurnace.AlloyFurnaceMultiBlock; +import net.halbear.aotg.custom.blocks.Forge.ForgeWorkbench; import net.halbear.aotg.custom.blocks.RockCoveredGrassBlock; import net.minecraft.world.item.BlockItem; import net.minecraft.world.level.block.Block; @@ -41,7 +42,7 @@ public class ModBlocks { public static final DeferredBlock OLIVE_LEAVES = RegisterBlock("olive_leaves", - properties -> new RockCoveredGrassBlock(properties.strength(0.25f) + properties -> new RockCoveredGrassBlock(properties.strength(0.15f) .requiresCorrectToolForDrops() .explosionResistance(0.5f) .sound(SoundType.GRASS) @@ -70,6 +71,14 @@ public class ModBlocks { .sound(SoundType.DEEPSLATE_BRICKS) .lightLevel(state -> 0) )); + public static final DeferredBlock FORGE_WORKBENCH = RegisterBlock("forge", + properties -> new ForgeWorkbench(properties.strength(1.5f) + .requiresCorrectToolForDrops() + .explosionResistance(6.0f) + .sound(SoundType.ANVIL) + .noOcclusion() + .lightLevel(state -> 0) + )); private static DeferredBlock RegisterBlock(String Name, Function function){ DeferredBlock newBlock = BLOCKS.registerBlock(Name, function); diff --git a/src/main/java/net/halbear/aotg/registries/ModItems.java b/src/main/java/net/halbear/aotg/registries/ModItems.java index 3da5978..83a2ae7 100644 --- a/src/main/java/net/halbear/aotg/registries/ModItems.java +++ b/src/main/java/net/halbear/aotg/registries/ModItems.java @@ -23,11 +23,20 @@ public class ModItems { public static final DeferredItem OLIVE_LEAVES_ITEM = ITEMS.registerSimpleBlockItem("olive_leaves", OLIVE_LEAVES); public static final DeferredItem OLIVE_LOG_ITEM = ITEMS.registerSimpleBlockItem("olive_log", OLIVE_LOG); public static final DeferredItem ALLOY_FURNACE_ITEM = ITEMS.registerSimpleBlockItem("alloy_furnace", ALLOY_FURNACE); + public static final DeferredItem FORGE_WORKBENCH_ITEM = ITEMS.registerSimpleBlockItem("forge", FORGE_WORKBENCH); public static final DeferredItem FLUID_INDICATOR_ITEM = RegisterItem("fluid_indicator_debug_item", properties -> new Item(properties .fireResistant() )); + public static final DeferredItem ZINC_INGOT = RegisterItem("zinc_ingot", Item::new); + public static final DeferredItem TIN_INGOT = RegisterItem("tin_ingot", Item::new); + public static final DeferredItem ELECTRUM_INGOT = RegisterItem("electrum_ingot", Item::new); + public static final DeferredItem BRONZE_INGOT = RegisterItem("bronze_ingot", Item::new); + public static final DeferredItem ORICHALCUM_INGOT = RegisterItem("orichalcum_ingot", Item::new); + public static final DeferredItem HEPATIZON_INGOT = RegisterItem("hepatizon_ingot", Item::new); + public static final DeferredItem SILVER_INGOT = RegisterItem("silver_ingot", Item::new); + public static final DeferredItem XIPHOS_SWORD = RegisterItem("xiphos", properties -> new Item(properties .tool(ModTiers.SWORD_TIER, diff --git a/src/main/java/net/halbear/aotg/registries/ModMenus.java b/src/main/java/net/halbear/aotg/registries/ModMenus.java index 30e45af..f466872 100644 --- a/src/main/java/net/halbear/aotg/registries/ModMenus.java +++ b/src/main/java/net/halbear/aotg/registries/ModMenus.java @@ -2,6 +2,7 @@ package net.halbear.aotg.registries; import net.halbear.aotg.AgeoftheGods; import net.halbear.aotg.custom.blocks.AlloyFurnace.AlloyFurnaceGUI; +import net.halbear.aotg.custom.blocks.Forge.ForgeWorkbenchGUI; import net.halbear.aotg.utility.Networking.MenuStateUpdate; import net.minecraft.client.Minecraft; import net.minecraft.core.registries.BuiltInRegistries; @@ -24,6 +25,9 @@ public class ModMenus { public static final DeferredHolder, MenuType> ALLOY_FURNACE_GUI = MENUS.register("alloy_furnace_gui", () -> IMenuTypeExtension.create(AlloyFurnaceGUI::new)); + public static final DeferredHolder, MenuType> FORGE_WORKBENCH_GUI = + MENUS.register("forge_workbench", () -> IMenuTypeExtension.create(ForgeWorkbenchGUI::new)); + public interface MenuAccessor { Map getMenuState(); diff --git a/src/main/java/net/halbear/aotg/registries/ModScreens.java b/src/main/java/net/halbear/aotg/registries/ModScreens.java index 4a3a173..f367daf 100644 --- a/src/main/java/net/halbear/aotg/registries/ModScreens.java +++ b/src/main/java/net/halbear/aotg/registries/ModScreens.java @@ -1,6 +1,7 @@ package net.halbear.aotg.registries; import net.halbear.aotg.custom.GuiScreens.AlloyFurnaceGUIScreen; +import net.halbear.aotg.custom.GuiScreens.ForgeWorkbenchGUIScreen; import net.halbear.aotg.custom.blocks.AlloyFurnace.AlloyFurnaceGUI; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; @@ -12,6 +13,7 @@ public class ModScreens { @SubscribeEvent public static void clientLoad(RegisterMenuScreensEvent event) { event.register(ModMenus.ALLOY_FURNACE_GUI.get(), AlloyFurnaceGUIScreen::new); + event.register(ModMenus.FORGE_WORKBENCH_GUI.get(), ForgeWorkbenchGUIScreen::new); } public interface ScreenAccessor { diff --git a/src/main/java/net/halbear/aotg/registries/ModTabs.java b/src/main/java/net/halbear/aotg/registries/ModTabs.java new file mode 100644 index 0000000..1ae453b --- /dev/null +++ b/src/main/java/net/halbear/aotg/registries/ModTabs.java @@ -0,0 +1,53 @@ +package net.halbear.aotg.registries; + +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.CreativeModeTabs; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; + +import static net.halbear.aotg.AgeoftheGods.MODID; +import static net.halbear.aotg.registries.ModItems.*; +import static net.halbear.aotg.registries.ModItems.ALLOY_FURNACE_ITEM; +import static net.halbear.aotg.registries.ModItems.BRONZE_INGOT; +import static net.halbear.aotg.registries.ModItems.ELECTRUM_INGOT; +import static net.halbear.aotg.registries.ModItems.FORGE_WORKBENCH_ITEM; +import static net.halbear.aotg.registries.ModItems.HEPATIZON_INGOT; +import static net.halbear.aotg.registries.ModItems.LIMESTONE_GRASS_ITEM; +import static net.halbear.aotg.registries.ModItems.OLIVE_LEAVES_ITEM; +import static net.halbear.aotg.registries.ModItems.OLIVE_LOG_ITEM; +import static net.halbear.aotg.registries.ModItems.ORICHALCUM_INGOT; +import static net.halbear.aotg.registries.ModItems.SHALE_GRASS_ITEM; +import static net.halbear.aotg.registries.ModItems.SILVER_INGOT; +import static net.halbear.aotg.registries.ModItems.TIN_INGOT; +import static net.halbear.aotg.registries.ModItems.XIPHOS_SWORD; +import static net.halbear.aotg.registries.ModItems.ZINC_INGOT; + +public class ModTabs { + public static final DeferredRegister CREATIVE_MODE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, MODID); + + + public static final DeferredHolder AGE_OF_THE_GODS_TAB = CREATIVE_MODE_TABS.register("age_of_the_gods", () -> CreativeModeTab.builder() + .title(Component.translatable("itemGroup.ageofthegods")) //The language key for the title of your CreativeModeTab + .withTabsBefore(CreativeModeTabs.COMBAT) + .icon(() -> XIPHOS_SWORD.get().getDefaultInstance()) + .displayItems((parameters, output) -> { + output.accept(LIMESTONE_ITEM.get()); + output.accept(SHALE_ITEM.get()); + output.accept(SHALE_GRASS_ITEM.get()); + output.accept(LIMESTONE_GRASS_ITEM.get()); + output.accept(OLIVE_LEAVES_ITEM.get()); + output.accept(OLIVE_LOG_ITEM.get()); + output.accept(XIPHOS_SWORD.get()); + output.accept(ALLOY_FURNACE_ITEM.get()); + output.accept(FORGE_WORKBENCH_ITEM.get()); + output.accept(TIN_INGOT.get()); + output.accept(ZINC_INGOT.get()); + output.accept(SILVER_INGOT.get()); + output.accept(BRONZE_INGOT.get()); + output.accept(ELECTRUM_INGOT.get()); + output.accept(HEPATIZON_INGOT.get()); + output.accept(ORICHALCUM_INGOT.get()); + }).build()); +} diff --git a/src/main/resources/assets/ageofthegods/Items/bronze_ingot.json b/src/main/resources/assets/ageofthegods/Items/bronze_ingot.json new file mode 100644 index 0000000..7b490ba --- /dev/null +++ b/src/main/resources/assets/ageofthegods/Items/bronze_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ageofthegods:item/ingot/bronze" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ageofthegods/Items/electrum_ingot.json b/src/main/resources/assets/ageofthegods/Items/electrum_ingot.json new file mode 100644 index 0000000..940e767 --- /dev/null +++ b/src/main/resources/assets/ageofthegods/Items/electrum_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ageofthegods:item/ingot/electrum" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ageofthegods/Items/forge.json b/src/main/resources/assets/ageofthegods/Items/forge.json new file mode 100644 index 0000000..f7fbdde --- /dev/null +++ b/src/main/resources/assets/ageofthegods/Items/forge.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ageofthegods:block/forge/forge" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ageofthegods/Items/hepatizon_ingot.json b/src/main/resources/assets/ageofthegods/Items/hepatizon_ingot.json new file mode 100644 index 0000000..e45c082 --- /dev/null +++ b/src/main/resources/assets/ageofthegods/Items/hepatizon_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ageofthegods:item/ingot/hepatizon" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ageofthegods/Items/orichalcum_ingot.json b/src/main/resources/assets/ageofthegods/Items/orichalcum_ingot.json new file mode 100644 index 0000000..7ccb871 --- /dev/null +++ b/src/main/resources/assets/ageofthegods/Items/orichalcum_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ageofthegods:item/ingot/orichalcum" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ageofthegods/Items/silver_ingot.json b/src/main/resources/assets/ageofthegods/Items/silver_ingot.json new file mode 100644 index 0000000..9939003 --- /dev/null +++ b/src/main/resources/assets/ageofthegods/Items/silver_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ageofthegods:item/ingot/silver" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ageofthegods/Items/tin_ingot.json b/src/main/resources/assets/ageofthegods/Items/tin_ingot.json new file mode 100644 index 0000000..2871b49 --- /dev/null +++ b/src/main/resources/assets/ageofthegods/Items/tin_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ageofthegods:item/ingot/tin" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ageofthegods/Items/zinc_ingot.json b/src/main/resources/assets/ageofthegods/Items/zinc_ingot.json new file mode 100644 index 0000000..5e9b61c --- /dev/null +++ b/src/main/resources/assets/ageofthegods/Items/zinc_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ageofthegods:item/ingot/zinc" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ageofthegods/blockstates/forge.json b/src/main/resources/assets/ageofthegods/blockstates/forge.json new file mode 100644 index 0000000..6a24746 --- /dev/null +++ b/src/main/resources/assets/ageofthegods/blockstates/forge.json @@ -0,0 +1,20 @@ +{ + "variants": { + "facing=north": { + "model": "ageofthegods:block/forge/forge", + "y": 0 + }, + "facing=south": { + "model": "ageofthegods:block/forge/forge", + "y": 180 + }, + "facing=west": { + "model": "ageofthegods:block/forge/forge", + "y": 270 + }, + "facing=east": { + "model": "ageofthegods:block/forge/forge", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ageofthegods/lang/en_us.json b/src/main/resources/assets/ageofthegods/lang/en_us.json index 43df201..c9bd05f 100644 --- a/src/main/resources/assets/ageofthegods/lang/en_us.json +++ b/src/main/resources/assets/ageofthegods/lang/en_us.json @@ -8,10 +8,19 @@ "block.ageofthegods.olive_leaves": "Olive Leaves", "block.ageofthegods.olive_log": "Olive Log", "block.ageofthegods.alloy_furnace": "Alloy Furnace Segment", + "block.ageofthegods.forge": "Forge", "gui.ageofthegods.alloy_furnace_gui.title": "Alloy Furnace", + "gui.ageofthegods.forge_workbench.title": "Forge", "item.ageofthegods.xiphos": "Xiphos", + "item.ageofthegods.zinc_ingot": "Zinc Ingot", + "item.ageofthegods.tin_ingot": "Tin Ingot", + "item.ageofthegods.silver_ingot": "Silver Ingot", + "item.ageofthegods.bronze_ingot": "Bronze Ingot", + "item.ageofthegods.electrum_ingot": "Electrum Ingot", + "item.ageofthegods.hepatizon_ingot": "Hepatizon Ingot", + "item.ageofthegods.orichalcum_ingot": "Orichalcum Ingot", "item.ageofthegods.fluid_indicator_debug_item": "Molten Alloy Mixture: ", "ageofthegods.configuration.title": "Age of the Gods Configs", diff --git a/src/main/resources/assets/ageofthegods/models/block/forge/forge.json b/src/main/resources/assets/ageofthegods/models/block/forge/forge.json new file mode 100644 index 0000000..204f363 --- /dev/null +++ b/src/main/resources/assets/ageofthegods/models/block/forge/forge.json @@ -0,0 +1,336 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "texture_size": [128, 128], + "textures": { + "0": "ageofthegods:block/forge/forge", + "particle": "ageofthegods:block/forge/forge" + }, + "elements": [ + { + "from": [0, 7, 6], + "to": [16, 13, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 10, 6]}, + "faces": { + "north": {"uv": [4.254, 1.254, 6.246, 1.996], "texture": "#0"}, + "east": {"uv": [4.754, 4.754, 5.871, 5.496], "texture": "#0"}, + "south": {"uv": [4.254, 2.129, 6.246, 2.871], "texture": "#0"}, + "west": {"uv": [0.004, 5.004, 1.121, 5.746], "texture": "#0"}, + "up": {"uv": [1.996, 3.621, 0.004, 2.504], "texture": "#0"}, + "down": {"uv": [4.121, 2.504, 2.129, 3.621], "texture": "#0"} + } + }, + { + "from": [16, 7, 8], + "to": [20, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 10, 6]}, + "faces": { + "north": {"uv": [7.254, 6.754, 7.746, 7.496], "texture": "#0"}, + "east": {"uv": [0.004, 6.754, 0.621, 7.496], "texture": "#0"}, + "south": {"uv": [5.004, 7.379, 5.496, 8.121], "texture": "#0"}, + "west": {"uv": [5.754, 6.754, 6.371, 7.496], "texture": "#0"}, + "up": {"uv": [3.246, 8.121, 2.754, 7.504], "texture": "#0"}, + "down": {"uv": [6.996, 7.504, 6.504, 8.121], "texture": "#0"} + } + }, + { + "from": [16, 7, 7.99], + "to": [24, 13, 7.99], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 10, 6]}, + "faces": { + "north": {"uv": [2.379, 5.754, 3.371, 6.496], "texture": "#0"}, + "east": {"uv": [3.379, 6.629, 3.379, 7.371], "texture": "#0"}, + "south": {"uv": [0.004, 5.879, 0.996, 6.621], "texture": "#0"}, + "west": {"uv": [6.379, 7.629, 6.379, 8.371], "texture": "#0"}, + "up": {"uv": [9.246, 0.254, 8.254, 0.254], "texture": "#0"}, + "down": {"uv": [9.246, 0.379, 8.254, 0.379], "texture": "#0"} + } + }, + { + "from": [16, 7, 13.01], + "to": [24, 13, 13.01], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 10, 15]}, + "faces": { + "north": {"uv": [6.004, 4.754, 6.996, 5.496], "texture": "#0"}, + "east": {"uv": [4.504, 8.004, 4.504, 8.746], "texture": "#0"}, + "south": {"uv": [6.129, 3.004, 7.121, 3.746], "texture": "#0"}, + "west": {"uv": [3.254, 8.254, 3.254, 8.996], "texture": "#0"}, + "up": {"uv": [9.246, 0.504, 8.254, 0.504], "texture": "#0"}, + "down": {"uv": [9.246, 0.629, 8.254, 0.629], "texture": "#0"} + } + }, + { + "from": [20, 10.725, 8], + "to": [23.75, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 10, 6]}, + "faces": { + "north": {"uv": [5.754, 0.879, 6.246, 1.121], "texture": "#0"}, + "east": {"uv": [4.004, 5.004, 4.621, 5.246], "texture": "#0"}, + "south": {"uv": [7.629, 8.004, 8.121, 8.246], "texture": "#0"}, + "west": {"uv": [7.879, 2.379, 8.496, 2.621], "texture": "#0"}, + "up": {"uv": [0.496, 8.246, 0.004, 7.629], "texture": "#0"}, + "down": {"uv": [8.121, 0.004, 7.629, 0.621], "texture": "#0"} + } + }, + { + "from": [17, 7, 8], + "to": [20, 12.275, 13], + "rotation": {"angle": -45, "axis": "z", "origin": [20, 7, 10.5]}, + "faces": { + "north": {"uv": [4.254, 3.004, 4.621, 3.621], "texture": "#0"}, + "east": {"uv": [6.879, 3.879, 7.496, 4.496], "texture": "#0"}, + "south": {"uv": [3.504, 5.754, 3.871, 6.371], "texture": "#0"}, + "west": {"uv": [7.004, 5.629, 7.621, 6.246], "texture": "#0"}, + "up": {"uv": [5.996, 8.246, 5.629, 7.629], "texture": "#0"}, + "down": {"uv": [8.246, 0.754, 7.879, 1.371], "texture": "#0"} + } + }, + { + "from": [-8, 13.01, 6], + "to": [25, 13.01, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 10, 6]}, + "faces": { + "north": {"uv": [7.754, 6.129, 11.871, 6.129], "texture": "#0"}, + "east": {"uv": [7.754, 6.254, 8.871, 6.254], "texture": "#0"}, + "south": {"uv": [7.879, 2.754, 11.996, 2.754], "texture": "#0"}, + "west": {"uv": [7.879, 2.879, 8.996, 2.879], "texture": "#0"}, + "up": {"uv": [4.121, 1.121, 0.004, 0.004], "texture": "#0"}, + "down": {"uv": [4.121, 1.254, 0.004, 2.371], "texture": "#0"} + } + }, + { + "from": [-8, 6.99, 6], + "to": [3, 6.99, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 4, 6]}, + "faces": { + "north": {"uv": [7.879, 5.129, 9.246, 5.129], "texture": "#0"}, + "east": {"uv": [7.879, 5.254, 8.996, 5.254], "texture": "#0"}, + "south": {"uv": [8.254, 0.004, 9.621, 0.004], "texture": "#0"}, + "west": {"uv": [8.254, 0.129, 9.371, 0.129], "texture": "#0"}, + "up": {"uv": [4.621, 4.871, 3.254, 3.754], "texture": "#0"}, + "down": {"uv": [5.621, 0.004, 4.254, 1.121], "texture": "#0"} + } + }, + { + "from": [-4, 7, 7], + "to": [1, 13, 12], + "rotation": {"angle": -45, "axis": "y", "origin": [-2.5, 10, 10.5]}, + "faces": { + "north": {"uv": [5.004, 6.504, 5.621, 7.246], "texture": "#0"}, + "east": {"uv": [1.129, 6.629, 1.746, 7.371], "texture": "#0"}, + "south": {"uv": [1.879, 6.629, 2.496, 7.371], "texture": "#0"}, + "west": {"uv": [2.629, 6.629, 3.246, 7.371], "texture": "#0"}, + "up": {"uv": [7.121, 7.371, 6.504, 6.754], "texture": "#0"}, + "down": {"uv": [7.496, 0.004, 6.879, 0.621], "texture": "#0"} + } + }, + { + "from": [-7.8, 7, 10], + "to": [-6.8, 13, 11], + "rotation": {"angle": 45, "axis": "y", "origin": [-7.3, 10, 10.5]}, + "faces": { + "north": {"uv": [8.254, 1.504, 8.371, 2.246], "texture": "#0"}, + "east": {"uv": [2.754, 8.254, 2.871, 8.996], "texture": "#0"}, + "south": {"uv": [3.004, 8.254, 3.121, 8.996], "texture": "#0"}, + "west": {"uv": [4.879, 8.254, 4.996, 8.996], "texture": "#0"}, + "up": {"uv": [4.621, 5.496, 4.504, 5.379], "texture": "#0"}, + "down": {"uv": [5.871, 6.504, 5.754, 6.621], "texture": "#0"} + } + }, + { + "from": [-8.25, 7, 6], + "to": [0, 13, 8], + "rotation": {"angle": 27.5, "axis": "y", "origin": [0, 10, 6]}, + "faces": { + "north": {"uv": [4.004, 5.629, 4.996, 6.371], "texture": "#0"}, + "east": {"uv": [7.879, 1.504, 8.121, 2.246], "texture": "#0"}, + "south": {"uv": [5.129, 5.629, 6.121, 6.371], "texture": "#0"}, + "west": {"uv": [7.879, 6.754, 8.121, 7.496], "texture": "#0"}, + "up": {"uv": [8.621, 4.496, 7.629, 4.254], "texture": "#0"}, + "down": {"uv": [8.121, 7.629, 7.129, 7.871], "texture": "#0"} + } + }, + { + "from": [-8.25, 7, 13], + "to": [0, 13, 15], + "rotation": {"angle": -27.5, "axis": "y", "origin": [0, 10, 15]}, + "faces": { + "north": {"uv": [5.754, 0.004, 6.746, 0.746], "texture": "#0"}, + "east": {"uv": [1.129, 8.004, 1.371, 8.746], "texture": "#0"}, + "south": {"uv": [1.254, 5.754, 2.246, 6.496], "texture": "#0"}, + "west": {"uv": [3.379, 8.004, 3.621, 8.746], "texture": "#0"}, + "up": {"uv": [8.746, 5.621, 7.754, 5.379], "texture": "#0"}, + "down": {"uv": [8.746, 5.754, 7.754, 5.996], "texture": "#0"} + } + }, + { + "from": [3, 1, 8], + "to": [13, 7, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 4, 6]}, + "faces": { + "north": {"uv": [4.754, 3.004, 5.996, 3.746], "texture": "#0"}, + "east": {"uv": [6.129, 3.879, 6.746, 4.621], "texture": "#0"}, + "south": {"uv": [4.754, 3.879, 5.996, 4.621], "texture": "#0"}, + "west": {"uv": [6.379, 2.004, 6.996, 2.746], "texture": "#0"}, + "up": {"uv": [2.496, 5.621, 1.254, 5.004], "texture": "#0"}, + "down": {"uv": [3.871, 5.004, 2.629, 5.621], "texture": "#0"} + } + }, + { + "from": [2, 0, 6], + "to": [14, 2, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 4, 6]}, + "faces": { + "north": {"uv": [7.004, 6.379, 8.496, 6.621], "texture": "#0"}, + "east": {"uv": [3.379, 7.629, 4.496, 7.871], "texture": "#0"}, + "south": {"uv": [7.254, 3.004, 8.746, 3.246], "texture": "#0"}, + "west": {"uv": [7.629, 3.879, 8.746, 4.121], "texture": "#0"}, + "up": {"uv": [1.496, 4.871, 0.004, 3.754], "texture": "#0"}, + "down": {"uv": [3.121, 3.754, 1.629, 4.871], "texture": "#0"} + } + }, + { + "from": [-3, 0, 0], + "to": [2, 8, 5], + "faces": { + "north": {"uv": [6.254, 5.629, 6.871, 6.621], "texture": "#0"}, + "east": {"uv": [6.379, 0.879, 6.996, 1.871], "texture": "#0"}, + "south": {"uv": [3.504, 6.504, 4.121, 7.496], "texture": "#0"}, + "west": {"uv": [4.254, 6.504, 4.871, 7.496], "texture": "#0"}, + "up": {"uv": [7.746, 1.371, 7.129, 0.754], "texture": "#0"}, + "down": {"uv": [7.746, 1.504, 7.129, 2.121], "texture": "#0"} + } + }, + { + "from": [2, 0, 0], + "to": [-3, 8, 5], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 0, 0]}, + "faces": { + "north": {"uv": [6.254, 5.629, 6.871, 6.621], "texture": "#0"}, + "east": {"uv": [6.379, 0.879, 6.996, 1.871], "texture": "#0"}, + "south": {"uv": [3.504, 6.504, 4.121, 7.496], "texture": "#0"}, + "west": {"uv": [4.254, 6.504, 4.871, 7.496], "texture": "#0"}, + "up": {"uv": [7.746, 1.371, 7.129, 0.754], "texture": "#0"}, + "down": {"uv": [7.746, 1.504, 7.129, 2.121], "texture": "#0"} + } + }, + { + "from": [-3, 6, 0], + "to": [2, 6, 5], + "faces": { + "north": {"uv": [6.379, 2.879, 6.996, 2.879], "texture": "#0"}, + "east": {"uv": [8.254, 3.379, 8.871, 3.379], "texture": "#0"}, + "south": {"uv": [8.254, 3.504, 8.871, 3.504], "texture": "#0"}, + "west": {"uv": [8.254, 3.629, 8.871, 3.629], "texture": "#0"}, + "up": {"uv": [7.746, 2.871, 7.129, 2.254], "texture": "#0"}, + "down": {"uv": [7.746, 4.629, 7.129, 5.246], "texture": "#0"} + } + }, + { + "from": [-1, 2, 4], + "to": [0, 15, 5], + "rotation": {"x": 15.57779, "y": 14.2906, "z": 4.60659, "origin": [-0.5, 8.5, 4.5]}, + "faces": { + "north": {"uv": [4.629, 7.629, 4.746, 9.246], "texture": "#0"}, + "east": {"uv": [6.129, 7.629, 6.246, 9.246], "texture": "#0"}, + "south": {"uv": [0.629, 8.004, 0.746, 9.621], "texture": "#0"}, + "west": {"uv": [0.879, 8.004, 0.996, 9.621], "texture": "#0"}, + "up": {"uv": [6.121, 6.621, 6.004, 6.504], "texture": "#0"}, + "down": {"uv": [0.871, 6.754, 0.754, 6.871], "texture": "#0"} + } + }, + { + "from": [17, -0.5, 3.25], + "to": [18, 10.5, 4.25], + "rotation": {"x": 43.99949, "y": 49.53655, "z": 42.73329, "origin": [17.5, 6.5, 3.75]}, + "faces": { + "north": {"uv": [1.504, 8.004, 1.621, 9.371], "texture": "#0"}, + "east": {"uv": [3.754, 8.004, 3.871, 9.371], "texture": "#0"}, + "south": {"uv": [4.004, 8.004, 4.121, 9.371], "texture": "#0"}, + "west": {"uv": [4.254, 8.004, 4.371, 9.371], "texture": "#0"}, + "up": {"uv": [4.121, 5.496, 4.004, 5.379], "texture": "#0"}, + "down": {"uv": [4.371, 5.379, 4.254, 5.496], "texture": "#0"} + } + }, + { + "from": [16, 6.5, 0.25], + "to": [19, 9.5, 7.25], + "rotation": {"x": 43.99949, "y": 49.53655, "z": 42.73329, "origin": [17.5, 6.5, 3.75]}, + "faces": { + "north": {"uv": [7.879, 4.629, 8.246, 4.996], "texture": "#0"}, + "east": {"uv": [7.254, 3.379, 8.121, 3.746], "texture": "#0"}, + "south": {"uv": [7.129, 8.004, 7.496, 8.371], "texture": "#0"}, + "west": {"uv": [0.754, 7.504, 1.621, 7.871], "texture": "#0"}, + "up": {"uv": [2.121, 8.371, 1.754, 7.504], "texture": "#0"}, + "down": {"uv": [2.621, 7.504, 2.254, 8.371], "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [0, -90, 0], + "translation": [0, 2.25, 0], + "scale": [0.4, 0.4, 0.4] + }, + "thirdperson_lefthand": { + "rotation": [0, 90, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_righthand": { + "rotation": [0, -60, 0], + "translation": [-1, 4.25, 0.25], + "scale": [0.28, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 110, 0], + "translation": [-1, 4.25, 0.25], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [29, -138, 0], + "translation": [0.25, 0, 0], + "scale": [0.55, 0.55, 0.55] + }, + "head": { + "translation": [0, 14.5, 0] + }, + "fixed": { + "rotation": [0, 180, 0] + }, + "on_shelf": { + "rotation": [0, 34, 0], + "scale": [0.75, 0.75, 0.75] + } + }, + "groups": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + { + "name": "group", + "origin": [18, 7, 4], + "scope": 0, + "color": 0, + "children": [18, 19] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/ageofthegods/models/item/ingot/bronze.json b/src/main/resources/assets/ageofthegods/models/item/ingot/bronze.json new file mode 100644 index 0000000..d102b3f --- /dev/null +++ b/src/main/resources/assets/ageofthegods/models/item/ingot/bronze.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ageofthegods:item/metals/bronze_ingot" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ageofthegods/models/item/ingot/electrum.json b/src/main/resources/assets/ageofthegods/models/item/ingot/electrum.json new file mode 100644 index 0000000..1316051 --- /dev/null +++ b/src/main/resources/assets/ageofthegods/models/item/ingot/electrum.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ageofthegods:item/metals/electrum_ingot" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ageofthegods/models/item/ingot/hepatizon.json b/src/main/resources/assets/ageofthegods/models/item/ingot/hepatizon.json new file mode 100644 index 0000000..7824b5d --- /dev/null +++ b/src/main/resources/assets/ageofthegods/models/item/ingot/hepatizon.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ageofthegods:item/metals/hepatizon_ingot" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ageofthegods/models/item/ingot/orichalcum.json b/src/main/resources/assets/ageofthegods/models/item/ingot/orichalcum.json new file mode 100644 index 0000000..2ffbdfe --- /dev/null +++ b/src/main/resources/assets/ageofthegods/models/item/ingot/orichalcum.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ageofthegods:item/metals/orichalcum_ingot" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ageofthegods/models/item/ingot/silver.json b/src/main/resources/assets/ageofthegods/models/item/ingot/silver.json new file mode 100644 index 0000000..1afbf56 --- /dev/null +++ b/src/main/resources/assets/ageofthegods/models/item/ingot/silver.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ageofthegods:item/metals/silver_ingot" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ageofthegods/models/item/ingot/tin.json b/src/main/resources/assets/ageofthegods/models/item/ingot/tin.json new file mode 100644 index 0000000..9874b7e --- /dev/null +++ b/src/main/resources/assets/ageofthegods/models/item/ingot/tin.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ageofthegods:item/metals/tin_ingot" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ageofthegods/models/item/ingot/zinc.json b/src/main/resources/assets/ageofthegods/models/item/ingot/zinc.json new file mode 100644 index 0000000..864c408 --- /dev/null +++ b/src/main/resources/assets/ageofthegods/models/item/ingot/zinc.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ageofthegods:item/metals/zinc_ingot" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ageofthegods/textures/block/forge/forge.png b/src/main/resources/assets/ageofthegods/textures/block/forge/forge.png new file mode 100644 index 0000000..d169785 Binary files /dev/null and b/src/main/resources/assets/ageofthegods/textures/block/forge/forge.png differ diff --git a/src/main/resources/assets/ageofthegods/textures/item/metals/bronze_ingot.png b/src/main/resources/assets/ageofthegods/textures/item/metals/bronze_ingot.png new file mode 100644 index 0000000..becc463 Binary files /dev/null and b/src/main/resources/assets/ageofthegods/textures/item/metals/bronze_ingot.png differ diff --git a/src/main/resources/assets/ageofthegods/textures/item/metals/electrum_ingot.png b/src/main/resources/assets/ageofthegods/textures/item/metals/electrum_ingot.png new file mode 100644 index 0000000..2716f84 Binary files /dev/null and b/src/main/resources/assets/ageofthegods/textures/item/metals/electrum_ingot.png differ diff --git a/src/main/resources/assets/ageofthegods/textures/item/metals/hepatizon_ingot.png b/src/main/resources/assets/ageofthegods/textures/item/metals/hepatizon_ingot.png new file mode 100644 index 0000000..b35cbb8 Binary files /dev/null and b/src/main/resources/assets/ageofthegods/textures/item/metals/hepatizon_ingot.png differ diff --git a/src/main/resources/assets/ageofthegods/textures/item/metals/orichalcum_ingot.png b/src/main/resources/assets/ageofthegods/textures/item/metals/orichalcum_ingot.png new file mode 100644 index 0000000..2e9466a Binary files /dev/null and b/src/main/resources/assets/ageofthegods/textures/item/metals/orichalcum_ingot.png differ diff --git a/src/main/resources/assets/ageofthegods/textures/item/metals/silver_ingot.png b/src/main/resources/assets/ageofthegods/textures/item/metals/silver_ingot.png new file mode 100644 index 0000000..f0e1991 Binary files /dev/null and b/src/main/resources/assets/ageofthegods/textures/item/metals/silver_ingot.png differ diff --git a/src/main/resources/assets/ageofthegods/textures/item/metals/tin_ingot.png b/src/main/resources/assets/ageofthegods/textures/item/metals/tin_ingot.png new file mode 100644 index 0000000..8aaca50 Binary files /dev/null and b/src/main/resources/assets/ageofthegods/textures/item/metals/tin_ingot.png differ diff --git a/src/main/resources/assets/ageofthegods/textures/item/metals/zinc_ingot.png b/src/main/resources/assets/ageofthegods/textures/item/metals/zinc_ingot.png new file mode 100644 index 0000000..c584ad4 Binary files /dev/null and b/src/main/resources/assets/ageofthegods/textures/item/metals/zinc_ingot.png differ diff --git a/src/main/resources/data/ageofthegods/neoforge/biome_modifier/vanilla_animals.json b/src/main/resources/data/ageofthegods/neoforge/biome_modifier/vanilla_animals.json new file mode 100644 index 0000000..cfe1009 --- /dev/null +++ b/src/main/resources/data/ageofthegods/neoforge/biome_modifier/vanilla_animals.json @@ -0,0 +1,46 @@ +{ + "type": "neoforge:add_spawns", + "biomes": [ + "ageofthegods:garrigue", + "ageofthegods:maquis_shrubland", + "ageofthegods:mediterranean_forest" + ], + "spawners": [ + { + "type": "minecraft:sheep", + "weight": 12, + "minCount": 1, + "maxCount": 4 + }, + { + "type": "minecraft:pig", + "weight": 10, + "minCount": 1, + "maxCount": 4 + }, + { + "type": "minecraft:chicken", + "weight": 10, + "minCount": 1, + "maxCount": 4 + }, + { + "type": "minecraft:cow", + "weight": 8, + "minCount": 1, + "maxCount": 4 + }, + { + "type": "minecraft:horse", + "weight": 5, + "minCount": 2, + "maxCount": 6 + }, + { + "type": "minecraft:goat", + "weight": 10, + "minCount": 1, + "maxCount": 9 + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/minecraft/dimension/overworld.json b/src/main/resources/data/minecraft/dimension/overworld.json index be02322..9469279 100644 --- a/src/main/resources/data/minecraft/dimension/overworld.json +++ b/src/main/resources/data/minecraft/dimension/overworld.json @@ -11,8 +11,8 @@ "parameters": { "temperature": [0.0, 0.5], "humidity": [-1.0, 0.0], - "continentalness": [-1.2, 1.0], - "erosion": [-1.0, 1.0], + "continentalness": [0.0, 1.0], + "erosion": [-0.5, 0.9], "weirdness": [-1.0, 1.0], "depth": 0.0, "offset": 0.0 @@ -21,10 +21,10 @@ { "biome": "ageofthegods:maquis_shrubland", "parameters": { - "temperature": [0.5, 1.0], + "temperature": [-1.0, 1.0], "humidity": [-1.0, 0.0], - "continentalness": [-1.2, 1.0], - "erosion": [-1.0, 1.0], + "continentalness": [0.15, 1.0], + "erosion": [-1.0, 0.0], "weirdness": [-1.0, 1.0], "depth": 0.0, "offset": 0.0 @@ -33,16 +33,140 @@ { "biome": "ageofthegods:mediterranean_forest", "parameters": { - "temperature": [-0.5, 0.0], + "temperature": [-0.5, 0.5], "humidity": [0.0, 1.0], - "continentalness": [-0.5, 0.9], + "continentalness": [0.0, 0.9], "erosion": [0.7, 1.0], - "weirdness": [0.0, 0.0], + "weirdness": [-1.0, 1.0], "depth": 0.0, "offset": 0.0 } + }, + { + "biome": "minecraft:beach", + "parameters": { + "temperature": [-0.45, 1.0], + "humidity": [-1.0, 1.0], + "continentalness": [-0.15, -0.13], + "erosion": [0.9, 1.0], + "weirdness": [-1.0, 1.0], + "depth": 0.0, + "offset": 0.0 + } + }, + { + "biome": "minecraft:ocean", + "parameters": { + "temperature": [-0.15, 0.2], + "humidity": [-1.0, 1.0], + "continentalness": [-0.45, -0.15], + "erosion": [0.7, 1.0], + "weirdness": [-0.1, 0.1], + "depth": 0.0, + "offset": 0.0 + } + }, + { + "biome": "minecraft:deep_ocean", + "parameters": { + "temperature": [-0.15, 0.2], + "humidity": [-1.0, 1.0], + "continentalness": [-1.2, -0.45], + "erosion": [0.7, 1.0], + "weirdness": [-0.1, 0.1], + + "depth": 0.0, + "offset": 0.0 + } + }, + { + "biome": "minecraft:lukewarm_ocean", + "parameters": { + "temperature": [0.2, 0.55], + "humidity": [-1.0, 1.0], + "continentalness": [-0.45, -0.15], + "erosion": [0.5, 1.0], + "weirdness": [-0.1, 0.1], + "depth": 0.0, + "offset": 0.0 + } + }, + { + "biome": "minecraft:deep_lukewarm_ocean", + "parameters": { + "temperature": [0.2, 0.55], + "humidity": [-1.0, 1.0], + "continentalness": [-1.2, -0.45], + "erosion": [-1.0, 1.0], + "weirdness": [-0.1, 0.1], + "depth": 0.0, + "offset": 0.0 + } + }, + { + "biome": "minecraft:warm_ocean", + "parameters": { + "temperature": [0.55, 1.0], + "humidity": [-1.0, 1.0], + "continentalness": [-0.45, -0.15], + "erosion": [-1.0, 1.0], + "weirdness": [-1.0, 1.0], + "depth": 0.0, + "offset": 0.0 + } + }, + { + "biome": "minecraft:lush_caves", + "parameters": { + "temperature": [-1.0, 1.0], + "humidity": [0.2, 1.0], + "continentalness": [-1.2, 1.0], + "erosion": [-1.0, 1.0], + "weirdness": [-0.75, 0.75], + "depth": 1.0, + "offset": 0.0 + } + }, + { + "biome": "minecraft:dripstone_caves", + "parameters": { + "temperature": [ + -1.0, + 1.0 + ], + "humidity": [ + -1.0, + 0.0 + ], + "continentalness": [ + -1.2, + 1.0 + ], + "erosion": [ + -1.0, + 1.0 + ], + "weirdness": [ + -0.85, + 0.85 + ], + "depth": 1.0, + "offset": 0.0 + } + }, + { + "biome": "minecraft:deep_dark", + "parameters": { + "temperature": [-1.0, 1.0], + "humidity": [-1.0, 0.0], + "continentalness": [-1.2, 1.0], + "erosion": [-1.0, 1.0], + "weirdness": [-1.0, 1.0], + "depth": 1.0, + "offset": 0.0 + } } ] } } -} \ No newline at end of file +} diff --git a/src/main/resources/data/minecraft/environment/overworld_fog.json b/src/main/resources/data/minecraft/environment/overworld_fog.json new file mode 100644 index 0000000..1518c29 --- /dev/null +++ b/src/main/resources/data/minecraft/environment/overworld_fog.json @@ -0,0 +1,20 @@ +{ + "biomes": [ + "minecraft:beach", + "minecraft:snowy_beach", + "minecraft:ocean", + "minecraft:deep_ocean", + "minecraft:warm_ocean", + "minecraft:lukewalk_ocean", + "minecraft:deep_lukewarm_ocean", + "minecraft:cold_ocean", + "minecraft:deep_cold_ocean", + "minecraft:frozen_ocean", + "minecraft:deep_frozen_ocean" + ], + "attributes": { + "minecraft:visual/fog_color": "#ccffffff", + "minecraft:visual/sky_color": "#ccffffff", + "minecraft:visual/cloud_color": "#ccffffff" + } +} diff --git a/src/main/resources/data/minecraft/tags/block/animals_spawnable_on.json b/src/main/resources/data/minecraft/tags/block/animals_spawnable_on.json new file mode 100644 index 0000000..8d5514d --- /dev/null +++ b/src/main/resources/data/minecraft/tags/block/animals_spawnable_on.json @@ -0,0 +1,12 @@ +{ + "replace": false, + "values": [ + "ageofthegods:limestone_grass_block", + "ageofthegods:shale_grass_block", + "minecraft:sand", + "minecraft:sandstone", + "minecraft:granite", + "ageofthegods:limestone_block", + "ageofthegods:shale_block" + ] +} \ No newline at end of file