alloy ingots, forge block, added animals back in, added oceans back in, added cave biomes back in

This commit is contained in:
Halbear
2026-07-30 00:36:57 +01:00
parent 8e273498b5
commit e929455902
42 changed files with 1391 additions and 31 deletions
@@ -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.ModBlocks.*;
import static net.halbear.aotg.registries.ModFoliagePlacers.FOLIAGE_PLACERS; import static net.halbear.aotg.registries.ModFoliagePlacers.FOLIAGE_PLACERS;
import static net.halbear.aotg.registries.ModItems.*; 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; import static net.halbear.aotg.registries.ModTreeGen.TRUNK_PLACERS;
// The value here should match an entry in the META-INF/neoforge.mods.toml file // 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 Logger LOGGER = LogUtils.getLogger();
public static final DeferredRegister<CreativeModeTab> CREATIVE_MODE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, MODID);
public static final DeferredHolder<CreativeModeTab, CreativeModeTab> 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. // 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. // FML will recognize some parameter types like IEventBus or ModContainer and pass them in automatically.
public AgeoftheGods(IEventBus modEventBus, ModContainer modContainer) { public AgeoftheGods(IEventBus modEventBus, ModContainer modContainer) {
@@ -76,7 +76,7 @@ public class AlloyFurnaceGUIScreen extends AbstractContainerScreen<AlloyFurnaceG
BlockPos position = new BlockPos(x,y,z); BlockPos position = new BlockPos(x,y,z);
if(state.getBlock().getName().getString().equals(ModBlocks.ALLOY_FURNACE.get().getName().getString())) { if(state.getBlock().getName().getString().equals(ModBlocks.ALLOY_FURNACE.get().getName().getString())) {
// if(!state.getValue(AlloyFurnaceMultiBlock.PARENT_BLOCK)){ // if(!state.getValue(AlloyFurnaceMultiBlock.PARENT_BLOCK)){
// int ModelPart = state.getValue(AlloyFurnaceMultiBlock.MODEL_PART); // int ModelPart = state.getValue(AlloyFurnaceMultiBlock.LEVEL);
// position = AlloyFurnaceUpdateHandler.GetParentPosFromModelPart(world,ModelPart,state,position); // position = AlloyFurnaceUpdateHandler.GetParentPosFromModelPart(world,ModelPart,state,position);
// if(position == null) return MinimumHeight; // if(position == null) return MinimumHeight;
// } // }
@@ -100,7 +100,7 @@ public class AlloyFurnaceGUIScreen extends AbstractContainerScreen<AlloyFurnaceG
@Override @Override
protected void extractLabels(GuiGraphicsExtractor guiGraphics, int mouseX, int mouseY) { protected void extractLabels(GuiGraphicsExtractor guiGraphics, int mouseX, int mouseY) {
guiGraphics.text(this.font, Component.translatable("gui.ageofthegods.alloy_furnace_gui.title"), 90, 6, -12829636, false); guiGraphics.text(this.font, Component.translatable("gui.ageofthegods.alloy_furnace_gui.title"), 96, 12, -12829636, false);
} }
@Override @Override
@@ -0,0 +1,80 @@
package net.halbear.aotg.custom.GuiScreens;
import com.mojang.blaze3d.platform.InputConstants;
import net.halbear.aotg.custom.blocks.Forge.ForgeWorkbenchGUI;
import net.halbear.aotg.registries.ModBlocks;
import net.halbear.aotg.registries.ModScreens;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.gui.components.ImageButton;
import net.minecraft.client.gui.components.WidgetSprites;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.client.input.KeyEvent;
import net.minecraft.client.renderer.RenderPipelines;
import net.minecraft.core.BlockPos;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.neoforged.neoforge.client.network.ClientPacketDistributor;
public class ForgeWorkbenchGUIScreen extends AbstractContainerScreen<ForgeWorkbenchGUI> 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();
}
}
@@ -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<Direction> 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 <E extends BlockEntity, A extends BlockEntity> @javax.annotation.Nullable BlockEntityTicker<A> createTickerHelper(
BlockEntityType<A> type, BlockEntityType<E> checkedType, BlockEntityTicker<? super E> ticker
) {
return checkedType == type ? (BlockEntityTicker<A>) ticker : null;
}
@Override
public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, BlockState state, BlockEntityType<T> 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<Block,BlockState> 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);
}
}
@@ -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<ItemStack> 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<ClientGamePacketListener> 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<ItemStack, ItemResource> resourceHandler = new ItemStacksResourceHandler(this.items) {
@Override
protected void onContentsChanged(int index, ItemStack stack) {
super.onContentsChanged(index, stack);
setChanged();
}
};
public StacksResourceHandler<ItemStack, ItemResource> 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<ItemStack> getItems() {
return this.items;
}
@Override
protected void setItems(NonNullList<ItemStack> 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();
}
}
@@ -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<String, Object> 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<ItemResource> internal;
private final Map<Integer, Slot> customSlots = new HashMap<>();
private boolean bound = false;
private Supplier<Boolean> 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<Integer, Slot> getSlots() {
return Collections.unmodifiableMap(customSlots);
}
@Override
public Map<String, Object> getMenuState() {
return menuState;
}
}
@@ -2,6 +2,7 @@ package net.halbear.aotg.registries;
import net.halbear.aotg.AgeoftheGods; import net.halbear.aotg.AgeoftheGods;
import net.halbear.aotg.custom.blocks.AlloyFurnace.AlloyFurnaceBlockEntity; 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.core.registries.Registries;
import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.BlockEntityType;
import net.neoforged.neoforge.registries.DeferredRegister; import net.neoforged.neoforge.registries.DeferredRegister;
@@ -20,5 +21,12 @@ public class ModBlockEntities {
ModBlocks.ALLOY_FURNACE.get() ModBlocks.ALLOY_FURNACE.get()
) )
); );
public static final Supplier<BlockEntityType<ForgeWorkbenchBlockEntity>> FORGE_WORKBENCH_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register(
"forge_workbench_block_entity",
() -> new BlockEntityType<>(
ForgeWorkbenchBlockEntity::new,
false,
ModBlocks.FORGE_WORKBENCH.get()
)
);
} }
@@ -2,6 +2,7 @@ package net.halbear.aotg.registries;
import net.halbear.aotg.AgeoftheGods; import net.halbear.aotg.AgeoftheGods;
import net.halbear.aotg.custom.blocks.AlloyFurnace.AlloyFurnaceMultiBlock; 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.halbear.aotg.custom.blocks.RockCoveredGrassBlock;
import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.BlockItem;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
@@ -41,7 +42,7 @@ public class ModBlocks {
public static final DeferredBlock<Block> OLIVE_LEAVES = RegisterBlock("olive_leaves", public static final DeferredBlock<Block> OLIVE_LEAVES = RegisterBlock("olive_leaves",
properties -> new RockCoveredGrassBlock(properties.strength(0.25f) properties -> new RockCoveredGrassBlock(properties.strength(0.15f)
.requiresCorrectToolForDrops() .requiresCorrectToolForDrops()
.explosionResistance(0.5f) .explosionResistance(0.5f)
.sound(SoundType.GRASS) .sound(SoundType.GRASS)
@@ -70,6 +71,14 @@ public class ModBlocks {
.sound(SoundType.DEEPSLATE_BRICKS) .sound(SoundType.DEEPSLATE_BRICKS)
.lightLevel(state -> 0) .lightLevel(state -> 0)
)); ));
public static final DeferredBlock<Block> FORGE_WORKBENCH = RegisterBlock("forge",
properties -> new ForgeWorkbench(properties.strength(1.5f)
.requiresCorrectToolForDrops()
.explosionResistance(6.0f)
.sound(SoundType.ANVIL)
.noOcclusion()
.lightLevel(state -> 0)
));
private static <T extends Block> DeferredBlock<T> RegisterBlock(String Name, Function<BlockBehaviour.Properties, T> function){ private static <T extends Block> DeferredBlock<T> RegisterBlock(String Name, Function<BlockBehaviour.Properties, T> function){
DeferredBlock<T> newBlock = BLOCKS.registerBlock(Name, function); DeferredBlock<T> newBlock = BLOCKS.registerBlock(Name, function);
@@ -23,11 +23,20 @@ public class ModItems {
public static final DeferredItem<BlockItem> OLIVE_LEAVES_ITEM = ITEMS.registerSimpleBlockItem("olive_leaves", OLIVE_LEAVES); public static final DeferredItem<BlockItem> OLIVE_LEAVES_ITEM = ITEMS.registerSimpleBlockItem("olive_leaves", OLIVE_LEAVES);
public static final DeferredItem<BlockItem> OLIVE_LOG_ITEM = ITEMS.registerSimpleBlockItem("olive_log", OLIVE_LOG); public static final DeferredItem<BlockItem> OLIVE_LOG_ITEM = ITEMS.registerSimpleBlockItem("olive_log", OLIVE_LOG);
public static final DeferredItem<BlockItem> ALLOY_FURNACE_ITEM = ITEMS.registerSimpleBlockItem("alloy_furnace", ALLOY_FURNACE); public static final DeferredItem<BlockItem> ALLOY_FURNACE_ITEM = ITEMS.registerSimpleBlockItem("alloy_furnace", ALLOY_FURNACE);
public static final DeferredItem<BlockItem> FORGE_WORKBENCH_ITEM = ITEMS.registerSimpleBlockItem("forge", FORGE_WORKBENCH);
public static final DeferredItem<Item> FLUID_INDICATOR_ITEM = RegisterItem("fluid_indicator_debug_item", properties -> new Item(properties public static final DeferredItem<Item> FLUID_INDICATOR_ITEM = RegisterItem("fluid_indicator_debug_item", properties -> new Item(properties
.fireResistant() .fireResistant()
)); ));
public static final DeferredItem<Item> ZINC_INGOT = RegisterItem("zinc_ingot", Item::new);
public static final DeferredItem<Item> TIN_INGOT = RegisterItem("tin_ingot", Item::new);
public static final DeferredItem<Item> ELECTRUM_INGOT = RegisterItem("electrum_ingot", Item::new);
public static final DeferredItem<Item> BRONZE_INGOT = RegisterItem("bronze_ingot", Item::new);
public static final DeferredItem<Item> ORICHALCUM_INGOT = RegisterItem("orichalcum_ingot", Item::new);
public static final DeferredItem<Item> HEPATIZON_INGOT = RegisterItem("hepatizon_ingot", Item::new);
public static final DeferredItem<Item> SILVER_INGOT = RegisterItem("silver_ingot", Item::new);
public static final DeferredItem<Item> XIPHOS_SWORD = RegisterItem("xiphos", public static final DeferredItem<Item> XIPHOS_SWORD = RegisterItem("xiphos",
properties -> new Item(properties properties -> new Item(properties
.tool(ModTiers.SWORD_TIER, .tool(ModTiers.SWORD_TIER,
@@ -2,6 +2,7 @@ package net.halbear.aotg.registries;
import net.halbear.aotg.AgeoftheGods; import net.halbear.aotg.AgeoftheGods;
import net.halbear.aotg.custom.blocks.AlloyFurnace.AlloyFurnaceGUI; 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.halbear.aotg.utility.Networking.MenuStateUpdate;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.BuiltInRegistries;
@@ -24,6 +25,9 @@ public class ModMenus {
public static final DeferredHolder<MenuType<?>, MenuType<AlloyFurnaceGUI>> ALLOY_FURNACE_GUI = public static final DeferredHolder<MenuType<?>, MenuType<AlloyFurnaceGUI>> ALLOY_FURNACE_GUI =
MENUS.register("alloy_furnace_gui", () -> IMenuTypeExtension.create(AlloyFurnaceGUI::new)); MENUS.register("alloy_furnace_gui", () -> IMenuTypeExtension.create(AlloyFurnaceGUI::new));
public static final DeferredHolder<MenuType<?>, MenuType<ForgeWorkbenchGUI>> FORGE_WORKBENCH_GUI =
MENUS.register("forge_workbench", () -> IMenuTypeExtension.create(ForgeWorkbenchGUI::new));
public interface MenuAccessor { public interface MenuAccessor {
Map<String, Object> getMenuState(); Map<String, Object> getMenuState();
@@ -1,6 +1,7 @@
package net.halbear.aotg.registries; package net.halbear.aotg.registries;
import net.halbear.aotg.custom.GuiScreens.AlloyFurnaceGUIScreen; import net.halbear.aotg.custom.GuiScreens.AlloyFurnaceGUIScreen;
import net.halbear.aotg.custom.GuiScreens.ForgeWorkbenchGUIScreen;
import net.halbear.aotg.custom.blocks.AlloyFurnace.AlloyFurnaceGUI; import net.halbear.aotg.custom.blocks.AlloyFurnace.AlloyFurnaceGUI;
import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.bus.api.SubscribeEvent;
@@ -12,6 +13,7 @@ public class ModScreens {
@SubscribeEvent @SubscribeEvent
public static void clientLoad(RegisterMenuScreensEvent event) { public static void clientLoad(RegisterMenuScreensEvent event) {
event.register(ModMenus.ALLOY_FURNACE_GUI.get(), AlloyFurnaceGUIScreen::new); event.register(ModMenus.ALLOY_FURNACE_GUI.get(), AlloyFurnaceGUIScreen::new);
event.register(ModMenus.FORGE_WORKBENCH_GUI.get(), ForgeWorkbenchGUIScreen::new);
} }
public interface ScreenAccessor { public interface ScreenAccessor {
@@ -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<CreativeModeTab> CREATIVE_MODE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, MODID);
public static final DeferredHolder<CreativeModeTab, CreativeModeTab> 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());
}
@@ -0,0 +1,6 @@
{
"model": {
"type": "minecraft:model",
"model": "ageofthegods:item/ingot/bronze"
}
}
@@ -0,0 +1,6 @@
{
"model": {
"type": "minecraft:model",
"model": "ageofthegods:item/ingot/electrum"
}
}
@@ -0,0 +1,6 @@
{
"model": {
"type": "minecraft:model",
"model": "ageofthegods:block/forge/forge"
}
}
@@ -0,0 +1,6 @@
{
"model": {
"type": "minecraft:model",
"model": "ageofthegods:item/ingot/hepatizon"
}
}
@@ -0,0 +1,6 @@
{
"model": {
"type": "minecraft:model",
"model": "ageofthegods:item/ingot/orichalcum"
}
}
@@ -0,0 +1,6 @@
{
"model": {
"type": "minecraft:model",
"model": "ageofthegods:item/ingot/silver"
}
}
@@ -0,0 +1,6 @@
{
"model": {
"type": "minecraft:model",
"model": "ageofthegods:item/ingot/tin"
}
}
@@ -0,0 +1,6 @@
{
"model": {
"type": "minecraft:model",
"model": "ageofthegods:item/ingot/zinc"
}
}
@@ -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
}
}
}
@@ -8,10 +8,19 @@
"block.ageofthegods.olive_leaves": "Olive Leaves", "block.ageofthegods.olive_leaves": "Olive Leaves",
"block.ageofthegods.olive_log": "Olive Log", "block.ageofthegods.olive_log": "Olive Log",
"block.ageofthegods.alloy_furnace": "Alloy Furnace Segment", "block.ageofthegods.alloy_furnace": "Alloy Furnace Segment",
"block.ageofthegods.forge": "Forge",
"gui.ageofthegods.alloy_furnace_gui.title": "Alloy Furnace", "gui.ageofthegods.alloy_furnace_gui.title": "Alloy Furnace",
"gui.ageofthegods.forge_workbench.title": "Forge",
"item.ageofthegods.xiphos": "Xiphos", "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: ", "item.ageofthegods.fluid_indicator_debug_item": "Molten Alloy Mixture: ",
"ageofthegods.configuration.title": "Age of the Gods Configs", "ageofthegods.configuration.title": "Age of the Gods Configs",
@@ -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]
}
]
}
@@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "ageofthegods:item/metals/bronze_ingot"
}
}
@@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "ageofthegods:item/metals/electrum_ingot"
}
}
@@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "ageofthegods:item/metals/hepatizon_ingot"
}
}
@@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "ageofthegods:item/metals/orichalcum_ingot"
}
}
@@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "ageofthegods:item/metals/silver_ingot"
}
}
@@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "ageofthegods:item/metals/tin_ingot"
}
}
@@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "ageofthegods:item/metals/zinc_ingot"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 382 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 390 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 381 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 B

@@ -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
}
]
}
@@ -11,8 +11,8 @@
"parameters": { "parameters": {
"temperature": [0.0, 0.5], "temperature": [0.0, 0.5],
"humidity": [-1.0, 0.0], "humidity": [-1.0, 0.0],
"continentalness": [-1.2, 1.0], "continentalness": [0.0, 1.0],
"erosion": [-1.0, 1.0], "erosion": [-0.5, 0.9],
"weirdness": [-1.0, 1.0], "weirdness": [-1.0, 1.0],
"depth": 0.0, "depth": 0.0,
"offset": 0.0 "offset": 0.0
@@ -21,10 +21,10 @@
{ {
"biome": "ageofthegods:maquis_shrubland", "biome": "ageofthegods:maquis_shrubland",
"parameters": { "parameters": {
"temperature": [0.5, 1.0], "temperature": [-1.0, 1.0],
"humidity": [-1.0, 0.0], "humidity": [-1.0, 0.0],
"continentalness": [-1.2, 1.0], "continentalness": [0.15, 1.0],
"erosion": [-1.0, 1.0], "erosion": [-1.0, 0.0],
"weirdness": [-1.0, 1.0], "weirdness": [-1.0, 1.0],
"depth": 0.0, "depth": 0.0,
"offset": 0.0 "offset": 0.0
@@ -33,14 +33,138 @@
{ {
"biome": "ageofthegods:mediterranean_forest", "biome": "ageofthegods:mediterranean_forest",
"parameters": { "parameters": {
"temperature": [-0.5, 0.0], "temperature": [-0.5, 0.5],
"humidity": [0.0, 1.0], "humidity": [0.0, 1.0],
"continentalness": [-0.5, 0.9], "continentalness": [0.0, 0.9],
"erosion": [0.7, 1.0], "erosion": [0.7, 1.0],
"weirdness": [0.0, 0.0], "weirdness": [-1.0, 1.0],
"depth": 0.0, "depth": 0.0,
"offset": 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
}
} }
] ]
} }
@@ -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"
}
}
@@ -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"
]
}