From 2b0b79c0146e5b6bbb230356b1d0a2de2bb26bba Mon Sep 17 00:00:00 2001 From: Robert Sosnitzka Date: Fri, 29 Apr 2016 16:29:16 +0200 Subject: inital commit --- src/main/java/blocks/BasicBlock.java | 16 ++++ src/main/java/blocks/BlockAdamantiteOre.java | 13 +++ src/main/java/blocks/BlockArcaniteOre.java | 13 +++ src/main/java/blocks/BlockBasalt.java | 13 +++ src/main/java/blocks/BlockBismuthOre.java | 13 +++ src/main/java/blocks/BlockEterniteOre.java | 13 +++ src/main/java/blocks/BlockKarmesineOre.java | 13 +++ src/main/java/blocks/BlockLigniteOre.java | 13 +++ src/main/java/blocks/BlockMeteoriteOre.java | 13 +++ src/main/java/blocks/BlockMindoriteOre.java | 13 +++ src/main/java/blocks/BlockMythrilOre.java | 13 +++ src/main/java/blocks/BlockPalladiumOre.java | 13 +++ src/main/java/blocks/BlockPrometheumOre.java | 13 +++ src/main/java/blocks/BlockRottenGround.java | 13 +++ src/main/java/blocks/BlockSlagironOre.java | 13 +++ src/main/java/blocks/BlockTiberiumOre.java | 13 +++ src/main/java/blocks/BlockVibraniumre.java | 13 +++ src/main/java/items/BasicItem.java | 12 +++ src/main/java/items/ItemSlagiron.java | 10 +++ src/main/java/main/ZCompression.java | 114 +++++++++++++++++++++++++++ src/main/java/main/util/Generator.java | 39 +++++++++ src/main/java/main/world/ZWorldGen.java | 65 +++++++++++++++ src/main/java/proxy/ClientProxy.java | 46 +++++++++++ src/main/java/proxy/ServerProxy.java | 7 ++ 24 files changed, 517 insertions(+) create mode 100644 src/main/java/blocks/BasicBlock.java create mode 100644 src/main/java/blocks/BlockAdamantiteOre.java create mode 100644 src/main/java/blocks/BlockArcaniteOre.java create mode 100644 src/main/java/blocks/BlockBasalt.java create mode 100644 src/main/java/blocks/BlockBismuthOre.java create mode 100644 src/main/java/blocks/BlockEterniteOre.java create mode 100644 src/main/java/blocks/BlockKarmesineOre.java create mode 100644 src/main/java/blocks/BlockLigniteOre.java create mode 100644 src/main/java/blocks/BlockMeteoriteOre.java create mode 100644 src/main/java/blocks/BlockMindoriteOre.java create mode 100644 src/main/java/blocks/BlockMythrilOre.java create mode 100644 src/main/java/blocks/BlockPalladiumOre.java create mode 100644 src/main/java/blocks/BlockPrometheumOre.java create mode 100644 src/main/java/blocks/BlockRottenGround.java create mode 100644 src/main/java/blocks/BlockSlagironOre.java create mode 100644 src/main/java/blocks/BlockTiberiumOre.java create mode 100644 src/main/java/blocks/BlockVibraniumre.java create mode 100644 src/main/java/items/BasicItem.java create mode 100644 src/main/java/items/ItemSlagiron.java create mode 100644 src/main/java/main/ZCompression.java create mode 100644 src/main/java/main/util/Generator.java create mode 100644 src/main/java/main/world/ZWorldGen.java create mode 100644 src/main/java/proxy/ClientProxy.java create mode 100644 src/main/java/proxy/ServerProxy.java (limited to 'src/main/java') diff --git a/src/main/java/blocks/BasicBlock.java b/src/main/java/blocks/BasicBlock.java new file mode 100644 index 0000000..2f61291 --- /dev/null +++ b/src/main/java/blocks/BasicBlock.java @@ -0,0 +1,16 @@ +package blocks; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; + +public class BasicBlock extends Block{ + + public BasicBlock(String name, Material material, float hardness, float resistance) { + super(material); + setUnlocalizedName(name); + setRegistryName(name); + setHardness(hardness); + setResistance(resistance); + } + +} diff --git a/src/main/java/blocks/BlockAdamantiteOre.java b/src/main/java/blocks/BlockAdamantiteOre.java new file mode 100644 index 0000000..eaab00d --- /dev/null +++ b/src/main/java/blocks/BlockAdamantiteOre.java @@ -0,0 +1,13 @@ +package blocks; + +import net.minecraft.block.material.Material; + +public class BlockAdamantiteOre extends BasicBlock{ + + public BlockAdamantiteOre() { + super("adamantite_ore", Material.ROCK, 3.0f, 5.0f); + } + + + +} diff --git a/src/main/java/blocks/BlockArcaniteOre.java b/src/main/java/blocks/BlockArcaniteOre.java new file mode 100644 index 0000000..6be72a7 --- /dev/null +++ b/src/main/java/blocks/BlockArcaniteOre.java @@ -0,0 +1,13 @@ +package blocks; + +import net.minecraft.block.material.Material; + +public class BlockArcaniteOre extends BasicBlock{ + + public BlockArcaniteOre() { + super("arcanite_ore", Material.ROCK, 3.0f, 5.0f); + } + + + +} diff --git a/src/main/java/blocks/BlockBasalt.java b/src/main/java/blocks/BlockBasalt.java new file mode 100644 index 0000000..16ff9c3 --- /dev/null +++ b/src/main/java/blocks/BlockBasalt.java @@ -0,0 +1,13 @@ +package blocks; + +import net.minecraft.block.material.Material; + +public class BlockBasalt extends BasicBlock{ + + public BlockBasalt() { + super("basalt", Material.ROCK, 12.0f, 2.0f); + } + + + +} diff --git a/src/main/java/blocks/BlockBismuthOre.java b/src/main/java/blocks/BlockBismuthOre.java new file mode 100644 index 0000000..c8b0632 --- /dev/null +++ b/src/main/java/blocks/BlockBismuthOre.java @@ -0,0 +1,13 @@ +package blocks; + +import net.minecraft.block.material.Material; + +public class BlockBismuthOre extends BasicBlock{ + + public BlockBismuthOre() { + super("bismuth_ore", Material.ROCK, 3.0f, 5.0f); + } + + + +} diff --git a/src/main/java/blocks/BlockEterniteOre.java b/src/main/java/blocks/BlockEterniteOre.java new file mode 100644 index 0000000..30c1143 --- /dev/null +++ b/src/main/java/blocks/BlockEterniteOre.java @@ -0,0 +1,13 @@ +package blocks; + +import net.minecraft.block.material.Material; + +public class BlockEterniteOre extends BasicBlock{ + + public BlockEterniteOre() { + super("eternite_ore", Material.ROCK, 3.0f, 5.0f); + } + + + +} diff --git a/src/main/java/blocks/BlockKarmesineOre.java b/src/main/java/blocks/BlockKarmesineOre.java new file mode 100644 index 0000000..21d1c74 --- /dev/null +++ b/src/main/java/blocks/BlockKarmesineOre.java @@ -0,0 +1,13 @@ +package blocks; + +import net.minecraft.block.material.Material; + +public class BlockKarmesineOre extends BasicBlock{ + + public BlockKarmesineOre() { + super("karmesine_ore", Material.ROCK, 3.0f, 5.0f); + } + + + +} diff --git a/src/main/java/blocks/BlockLigniteOre.java b/src/main/java/blocks/BlockLigniteOre.java new file mode 100644 index 0000000..77f0f74 --- /dev/null +++ b/src/main/java/blocks/BlockLigniteOre.java @@ -0,0 +1,13 @@ +package blocks; + +import net.minecraft.block.material.Material; + +public class BlockLigniteOre extends BasicBlock{ + + public BlockLigniteOre() { + super("lignite_ore", Material.ROCK, 3.0f, 5.0f); + } + + + +} diff --git a/src/main/java/blocks/BlockMeteoriteOre.java b/src/main/java/blocks/BlockMeteoriteOre.java new file mode 100644 index 0000000..76e23c8 --- /dev/null +++ b/src/main/java/blocks/BlockMeteoriteOre.java @@ -0,0 +1,13 @@ +package blocks; + +import net.minecraft.block.material.Material; + +public class BlockMeteoriteOre extends BasicBlock{ + + public BlockMeteoriteOre() { + super("meteorite_ore", Material.ROCK, 3.0f, 5.0f); + } + + + +} diff --git a/src/main/java/blocks/BlockMindoriteOre.java b/src/main/java/blocks/BlockMindoriteOre.java new file mode 100644 index 0000000..1ace48b --- /dev/null +++ b/src/main/java/blocks/BlockMindoriteOre.java @@ -0,0 +1,13 @@ +package blocks; + +import net.minecraft.block.material.Material; + +public class BlockMindoriteOre extends BasicBlock{ + + public BlockMindoriteOre() { + super("mindorite_ore", Material.ROCK, 3.0f, 5.0f); + } + + + +} diff --git a/src/main/java/blocks/BlockMythrilOre.java b/src/main/java/blocks/BlockMythrilOre.java new file mode 100644 index 0000000..8e3975c --- /dev/null +++ b/src/main/java/blocks/BlockMythrilOre.java @@ -0,0 +1,13 @@ +package blocks; + +import net.minecraft.block.material.Material; + +public class BlockMythrilOre extends BasicBlock{ + + public BlockMythrilOre() { + super("mythril_ore", Material.ROCK, 3.0f, 5.0f); + } + + + +} diff --git a/src/main/java/blocks/BlockPalladiumOre.java b/src/main/java/blocks/BlockPalladiumOre.java new file mode 100644 index 0000000..61d8488 --- /dev/null +++ b/src/main/java/blocks/BlockPalladiumOre.java @@ -0,0 +1,13 @@ +package blocks; + +import net.minecraft.block.material.Material; + +public class BlockPalladiumOre extends BasicBlock{ + + public BlockPalladiumOre() { + super("palladium_ore", Material.ROCK, 3.0f, 5.0f); + } + + + +} diff --git a/src/main/java/blocks/BlockPrometheumOre.java b/src/main/java/blocks/BlockPrometheumOre.java new file mode 100644 index 0000000..e278783 --- /dev/null +++ b/src/main/java/blocks/BlockPrometheumOre.java @@ -0,0 +1,13 @@ +package blocks; + +import net.minecraft.block.material.Material; + +public class BlockPrometheumOre extends BasicBlock{ + + public BlockPrometheumOre() { + super("prometheum_ore", Material.ROCK, 3.0f, 5.0f); + } + + + +} diff --git a/src/main/java/blocks/BlockRottenGround.java b/src/main/java/blocks/BlockRottenGround.java new file mode 100644 index 0000000..c3f4723 --- /dev/null +++ b/src/main/java/blocks/BlockRottenGround.java @@ -0,0 +1,13 @@ +package blocks; + +import net.minecraft.block.material.Material; + +public class BlockRottenGround extends BasicBlock{ + + public BlockRottenGround() { + super("rotten_ground", Material.GROUND, 1.0f, 1.0f); + } + + + +} diff --git a/src/main/java/blocks/BlockSlagironOre.java b/src/main/java/blocks/BlockSlagironOre.java new file mode 100644 index 0000000..7023bc8 --- /dev/null +++ b/src/main/java/blocks/BlockSlagironOre.java @@ -0,0 +1,13 @@ +package blocks; + +import net.minecraft.block.material.Material; + +public class BlockSlagironOre extends BasicBlock{ + + public BlockSlagironOre() { + super("slagiron_ore", Material.ROCK, 3.0f, 5.0f); + } + + + +} diff --git a/src/main/java/blocks/BlockTiberiumOre.java b/src/main/java/blocks/BlockTiberiumOre.java new file mode 100644 index 0000000..d143846 --- /dev/null +++ b/src/main/java/blocks/BlockTiberiumOre.java @@ -0,0 +1,13 @@ +package blocks; + +import net.minecraft.block.material.Material; + +public class BlockTiberiumOre extends BasicBlock{ + + public BlockTiberiumOre() { + super("tiberium_ore", Material.ROCK, 3.0f, 5.0f); + } + + + +} diff --git a/src/main/java/blocks/BlockVibraniumre.java b/src/main/java/blocks/BlockVibraniumre.java new file mode 100644 index 0000000..792cad9 --- /dev/null +++ b/src/main/java/blocks/BlockVibraniumre.java @@ -0,0 +1,13 @@ +package blocks; + +import net.minecraft.block.material.Material; + +public class BlockVibraniumre extends BasicBlock{ + + public BlockVibraniumre() { + super("vibranium_ore", Material.ROCK, 3.0f, 5.0f); + } + + + +} diff --git a/src/main/java/items/BasicItem.java b/src/main/java/items/BasicItem.java new file mode 100644 index 0000000..92196cd --- /dev/null +++ b/src/main/java/items/BasicItem.java @@ -0,0 +1,12 @@ +package items; + +import net.minecraft.item.Item; + +public class BasicItem extends Item{ + + public BasicItem(String name) { + setUnlocalizedName(name); + setRegistryName(name); + } + +} diff --git a/src/main/java/items/ItemSlagiron.java b/src/main/java/items/ItemSlagiron.java new file mode 100644 index 0000000..9775409 --- /dev/null +++ b/src/main/java/items/ItemSlagiron.java @@ -0,0 +1,10 @@ +package items; + +public class ItemSlagiron extends BasicItem{ + + public ItemSlagiron() { + super("slagiron"); + } + + +} diff --git a/src/main/java/main/ZCompression.java b/src/main/java/main/ZCompression.java new file mode 100644 index 0000000..a264ec7 --- /dev/null +++ b/src/main/java/main/ZCompression.java @@ -0,0 +1,114 @@ +package main; + +import blocks.BasicBlock; +import blocks.BlockAdamantiteOre; +import blocks.BlockArcaniteOre; +import blocks.BlockBasalt; +import blocks.BlockBismuthOre; +import blocks.BlockEterniteOre; +import blocks.BlockKarmesineOre; +import blocks.BlockLigniteOre; +import blocks.BlockMeteoriteOre; +import blocks.BlockMindoriteOre; +import blocks.BlockMythrilOre; +import blocks.BlockPalladiumOre; +import blocks.BlockPrometheumOre; +import blocks.BlockRottenGround; +import blocks.BlockSlagironOre; +import blocks.BlockTiberiumOre; +import blocks.BlockVibraniumre; +import items.ItemSlagiron; +import main.world.ZWorldGen; +import net.minecraft.item.ItemBlock; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.Mod.EventHandler; +import net.minecraftforge.fml.common.SidedProxy; +import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.registry.GameRegistry; +import proxy.ServerProxy; + +@Mod(modid = ZCompression.MODID, version = ZCompression.VERSION) +public class ZCompression { + + public static final String MODID = "zcompression"; + public static final String VERSION = "1.0"; + + @SidedProxy(clientSide = "proxy.ClientProxy", serverSide = "proxy.ServerProxy") + public static ServerProxy proxy; + + // Items + public static ItemSlagiron slagiron = new ItemSlagiron(); + + + //Blocks, esp. for tconstruct + public static BlockAdamantiteOre adamantiteOre = new BlockAdamantiteOre(); + public static BlockArcaniteOre arcaniteOre = new BlockArcaniteOre(); + public static BlockBasalt basalt = new BlockBasalt(); + public static BlockBismuthOre bismuthOre = new BlockBismuthOre(); + public static BlockEterniteOre eterniteOre = new BlockEterniteOre(); + public static BlockKarmesineOre karmesineOre = new BlockKarmesineOre(); + public static BlockLigniteOre ligniteOre = new BlockLigniteOre(); + public static BlockMeteoriteOre meteoriteOre = new BlockMeteoriteOre(); + public static BlockMindoriteOre mindoriteOre = new BlockMindoriteOre(); + public static BlockMythrilOre mythrilOre = new BlockMythrilOre(); + public static BlockPalladiumOre palladiumOre = new BlockPalladiumOre(); + public static BlockPrometheumOre prometheumOre = new BlockPrometheumOre(); + public static BlockRottenGround rottenGround = new BlockRottenGround(); + public static BlockSlagironOre slagironOre = new BlockSlagironOre(); + public static BlockTiberiumOre tiberiumOre = new BlockTiberiumOre(); + public static BlockVibraniumre vibraniumOre = new BlockVibraniumre(); + + + + + + + + + + + + @EventHandler + public void preInit(FMLPreInitializationEvent e){ + GameRegistry.register(slagiron); + registerBlock(adamantiteOre); + registerBlock(arcaniteOre); + registerBlock(basalt); + registerBlock(bismuthOre); + registerBlock(eterniteOre); + registerBlock(karmesineOre); + registerBlock(ligniteOre); + registerBlock(meteoriteOre); + registerBlock(mindoriteOre); + registerBlock(mythrilOre); + registerBlock(palladiumOre); + registerBlock(prometheumOre); + registerBlock(rottenGround); + registerBlock(slagironOre); + registerBlock(tiberiumOre); + registerBlock(vibraniumOre); + + } + + @EventHandler + public void init(FMLInitializationEvent e){ + proxy.registerClientStuff(); + GameRegistry.registerWorldGenerator(new ZWorldGen(), 100); + + } + + @EventHandler + public void postInit(FMLPostInitializationEvent e){ + + } + + public static void registerBlock(BasicBlock block){ + GameRegistry.register(block); + GameRegistry.register(new ItemBlock(block).setRegistryName(block.getRegistryName())); + } + + + +} diff --git a/src/main/java/main/util/Generator.java b/src/main/java/main/util/Generator.java new file mode 100644 index 0000000..5ff7781 --- /dev/null +++ b/src/main/java/main/util/Generator.java @@ -0,0 +1,39 @@ +package main.util; + +import java.util.Random; + +import com.google.common.base.Predicate; + +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.block.state.pattern.BlockMatcher; +import net.minecraft.init.Blocks; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.gen.feature.WorldGenMinable; + +public class Generator { + + public static void generateOre(IBlockState state, Random random, int x, int z, World world, int chance, int minY, int maxY, int minSize, int maxSize){ + generateOre(state, Blocks.STONE, random, x, z, world, chance, minY, maxY, minSize, maxSize); + } + + public static void generateNetherOre(IBlockState state, Random random, int x, int z, World world, int chance, int minY, int maxY, int minSize, int maxSize){ + generateOre(state, Blocks.NETHERRACK, random, x, z, world, chance, minY, maxY, minSize, maxSize); + } + + + public static void generateOre(IBlockState state, Block replace, Random random, int chunkX, int chunkZ, World world, int chance, int minY, int maxY, int minSize, int maxSize){ + int size = minSize + random.nextInt(maxSize - minSize); + int height = maxY - minY; + + for(int i = 0; i < chance; i++) { + int posX = chunkX + random.nextInt(16); + int posY = random.nextInt(height) + minY; + int posZ = chunkZ + random.nextInt(16); + new WorldGenMinable(state, size, BlockMatcher.forBlock(replace)).generate(world, random, new BlockPos(posX, posY, posZ)); + } + } + + +} diff --git a/src/main/java/main/world/ZWorldGen.java b/src/main/java/main/world/ZWorldGen.java new file mode 100644 index 0000000..06910d3 --- /dev/null +++ b/src/main/java/main/world/ZWorldGen.java @@ -0,0 +1,65 @@ +package main.world; + +import java.util.Random; + +import com.google.common.base.Predicates; + +import main.ZCompression; +import main.util.Generator; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; +import net.minecraft.world.chunk.IChunkGenerator; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraftforge.fml.common.IWorldGenerator; + +public class ZWorldGen implements IWorldGenerator { + + + private void nether(Random random, int x, int z, World world){ + Generator.generateNetherOre(ZCompression.adamantiteOre.getDefaultState(), random, x, z, world, 24, 1, 32, 2, 5); + Generator.generateNetherOre(ZCompression.tiberiumOre.getDefaultState(), random, x, z, world, 60, 1, 128, 2, 10); + Generator.generateNetherOre(ZCompression.palladiumOre.getDefaultState(), random, x, z, world, 15, 32, 64, 3, 6); + Generator.generateOre(ZCompression.prometheumOre.getDefaultState(), random, x, z, world, 20, 48, 64, 2, 4); + } + + private void world(Random random, int x, int z, World world){ + // Regular + Generator.generateOre(ZCompression.slagironOre.getDefaultState(), random, x, z, world, 40, 8, 96, 5, 16); + Generator.generateOre(ZCompression.ligniteOre.getDefaultState(), random, x, z, world, 40, 8, 96, 5, 15); + Generator.generateOre(Blocks.IRON_ORE.getDefaultState(),random, x, z, world, 40, 8, 96, 2, 10); + Generator.generateOre(ZCompression.basalt.getDefaultState(), Blocks.LAVA, random, x, z, world, 20, 8, 24, 2, 5); + Generator.generateOre(ZCompression.rottenGround.getDefaultState(), Blocks.DIRT, random, x, z, world, 25, 50, 70, 2, 15); + + Generator.generateOre(ZCompression.vibraniumOre.getDefaultState(), random, x, z, world, 16, 48, 64, 2, 4); + Generator.generateOre(ZCompression.mythrilOre.getDefaultState(), random, x, z, world, 16, 16, 32, 2, 4); + Generator.generateOre(ZCompression.meteoriteOre.getDefaultState(), random, x, z, world, 25, 0, 32, 3, 6); + Generator.generateOre(ZCompression.mindoriteOre.getDefaultState(), Blocks.STONE, random, x, z, world, 450, 32, 96, 3, 6); + } + + private void end(Random random, int x, int z, World world){ + + } + + + + @Override + public void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, + IChunkProvider chunkProvider) { + int x = chunkX * 16; + int z = chunkZ * 16; + switch(world.provider.getDimension()) { + case -1: + nether(random, x, z, world); + break; + case 0: + world(random, x, z, world); + break; + case 1: + end(random, x, z, world); + break; + } + + } + +} diff --git a/src/main/java/proxy/ClientProxy.java b/src/main/java/proxy/ClientProxy.java new file mode 100644 index 0000000..1c44f72 --- /dev/null +++ b/src/main/java/proxy/ClientProxy.java @@ -0,0 +1,46 @@ +package proxy; + +import blocks.BasicBlock; +import items.BasicItem; +import main.ZCompression; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.item.Item; + +public class ClientProxy extends ServerProxy{ + + @Override + public void registerClientStuff() { + // Items + registerItemModel(ZCompression.slagiron); + + // Blocks + registerBlockModel(ZCompression.adamantiteOre); + registerBlockModel(ZCompression.arcaniteOre); + registerBlockModel(ZCompression.basalt); + registerBlockModel(ZCompression.bismuthOre); + registerBlockModel(ZCompression.eterniteOre); + registerBlockModel(ZCompression.karmesineOre); + registerBlockModel(ZCompression.ligniteOre); + registerBlockModel(ZCompression.meteoriteOre); + registerBlockModel(ZCompression.mindoriteOre); + registerBlockModel(ZCompression.mythrilOre); + registerBlockModel(ZCompression.palladiumOre); + registerBlockModel(ZCompression.prometheumOre); + registerBlockModel(ZCompression.rottenGround); + registerBlockModel(ZCompression.slagironOre); + registerBlockModel(ZCompression.tiberiumOre); + registerBlockModel(ZCompression.vibraniumOre); + + + } + + public static void registerItemModel(Item item){ + Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(item, 0, new ModelResourceLocation(item.getRegistryName(), "inventory")); + } + + public static void registerBlockModel(Block block){ + registerItemModel(Item.getItemFromBlock(block)); + } +} diff --git a/src/main/java/proxy/ServerProxy.java b/src/main/java/proxy/ServerProxy.java new file mode 100644 index 0000000..c213f2b --- /dev/null +++ b/src/main/java/proxy/ServerProxy.java @@ -0,0 +1,7 @@ +package proxy; + +public class ServerProxy { + + public void registerClientStuff() {} + +} -- cgit v1.2.3