From 688fcaea2633c209b80d83a3fd4801ce2b27cd24 Mon Sep 17 00:00:00 2001 From: lanicerine Date: Fri, 3 Jul 2026 01:47:04 +0300 Subject: [PATCH] commit 1 --- .../common/blocks/BlockSolarPanel.java | 70 ++++ .../common/blocks/SuSyBlocks.java | 1 + .../SuSyMetaTileEntities.java | 5 + .../electric/MetaTileEntitySolarPanel.java | 159 ++++++++ .../blocks/solar_panel/default/default.png | Bin 0 -> 9218 bytes .../assets/susy/blockstates/solar_panel.json | 6 + .../resources/assets/susy/lang/en_us.lang | 10 + .../models/block/solar_panel/default.json | 365 ++++++++++++++++++ 8 files changed, 616 insertions(+) create mode 100644 src/main/java/supersymmetry/common/blocks/BlockSolarPanel.java create mode 100644 src/main/java/supersymmetry/common/metatileentities/single/electric/MetaTileEntitySolarPanel.java create mode 100644 src/main/resources/assets/gregtech/textures/blocks/solar_panel/default/default.png create mode 100644 src/main/resources/assets/susy/blockstates/solar_panel.json create mode 100644 src/main/resources/assets/susy/models/block/solar_panel/default.json diff --git a/src/main/java/supersymmetry/common/blocks/BlockSolarPanel.java b/src/main/java/supersymmetry/common/blocks/BlockSolarPanel.java new file mode 100644 index 000000000..2775a2edc --- /dev/null +++ b/src/main/java/supersymmetry/common/blocks/BlockSolarPanel.java @@ -0,0 +1,70 @@ +package supersymmetry.common.blocks; + +import gregtech.api.block.IStateHarvestLevel; +import gregtech.api.block.VariantBlock; +import net.minecraft.block.SoundType; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityLiving; +import net.minecraft.util.BlockRenderLayer; +import net.minecraft.util.IStringSerializable; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nonnull; + +public class BlockSolarPanel extends VariantBlock { + + public BlockSolarPanel() { + super(net.minecraft.block.material.Material.IRON); + setTranslationKey("solar_panel"); + setHardness(-1.0f); + setResistance(1000.0f); + setSoundType(SoundType.METAL); + setHarvestLevel("wrench", 10); + setDefaultState(getState(SolarPanelType.DEFAULT)); + } + + @Override + public boolean canCreatureSpawn(@NotNull IBlockState state, @NotNull IBlockAccess world, @NotNull BlockPos pos, + @NotNull EntityLiving.SpawnPlacementType type) { + return false; + } + + @Override + public boolean isOpaqueCube(@NotNull IBlockState state) { + return false; + } + + @NotNull + @Override + public BlockRenderLayer getRenderLayer() { + return BlockRenderLayer.CUTOUT; + } + + public enum SolarPanelType implements IStringSerializable, IStateHarvestLevel { + + DEFAULT("default", 9); + + private final String name; + private final int harvestLevel; + + SolarPanelType(String name, int harvestLevel) { + this.name = name; + this.harvestLevel = harvestLevel; + } + + @Nonnull + public String getName() { + return this.name; + } + + public int getHarvestLevel(IBlockState state) { + return this.harvestLevel; + } + + public String getHarvestTool(IBlockState state) { + return "wrench"; + } + } +} diff --git a/src/main/java/supersymmetry/common/blocks/SuSyBlocks.java b/src/main/java/supersymmetry/common/blocks/SuSyBlocks.java index 15d350825..0acfa16a5 100644 --- a/src/main/java/supersymmetry/common/blocks/SuSyBlocks.java +++ b/src/main/java/supersymmetry/common/blocks/SuSyBlocks.java @@ -92,6 +92,7 @@ public class SuSyBlocks { public static BlockGrinderCasing GRINDER_CASING; public static BlockGirthGearTooth GIRTH_GEAR_TOOTH; public static BlockEDMElectrode EDM_ELECTRODE; + public static BlockSolarPanel SOLAR_PANEL; public static BlockLunarConcrete LUNAR_CONCRETE; diff --git a/src/main/java/supersymmetry/common/metatileentities/SuSyMetaTileEntities.java b/src/main/java/supersymmetry/common/metatileentities/SuSyMetaTileEntities.java index ac35f6a2a..da5edfcaf 100644 --- a/src/main/java/supersymmetry/common/metatileentities/SuSyMetaTileEntities.java +++ b/src/main/java/supersymmetry/common/metatileentities/SuSyMetaTileEntities.java @@ -239,6 +239,7 @@ public class SuSyMetaTileEntities { public static MetaTileEntityIncinerator[] INCINERATOR = new MetaTileEntityIncinerator[4]; public static MetaTileEntityRTG[] RTG = new MetaTileEntityRTG[8]; + public static MetaTileEntitySolarPanel[] SOLAR_PANEL = new MetaTileEntitySolarPanel[2]; public static MetaTileEntityStrandBus IMPORT_STRAND; public static MetaTileEntityStrandBus EXPORT_STRAND; @@ -570,6 +571,10 @@ public static void init() { RTG[0] = registerMetaTileEntity(16504, new MetaTileEntityRTG(susyId("rtg.lv"), 1)); RTG[1] = registerMetaTileEntity(16505, new MetaTileEntityRTG(susyId("rtg.mv"), 2)); + // Solar panels: 16512-16520 + SOLAR_PANEL[0] = registerMetaTileEntity(16512, new MetaTileEntitySolarPanel(susyId("solar_panel.lv"), 1)); + SOLAR_PANEL[1] = registerMetaTileEntity(16513, new MetaTileEntitySolarPanel(susyId("solar_panel.mv"), 2)); + // Strand casting: 16600-16610 IMPORT_STRAND = registerMetaTileEntity(16600, new MetaTileEntityStrandBus(susyId("strand_bus.import"), false)); EXPORT_STRAND = registerMetaTileEntity(16601, new MetaTileEntityStrandBus(susyId("strand_bus.export"), true)); diff --git a/src/main/java/supersymmetry/common/metatileentities/single/electric/MetaTileEntitySolarPanel.java b/src/main/java/supersymmetry/common/metatileentities/single/electric/MetaTileEntitySolarPanel.java new file mode 100644 index 000000000..a1bd87412 --- /dev/null +++ b/src/main/java/supersymmetry/common/metatileentities/single/electric/MetaTileEntitySolarPanel.java @@ -0,0 +1,159 @@ +package supersymmetry.common.metatileentities.single.electric; + +import gregtech.api.GTValues; +import gregtech.api.gui.ModularUI; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.TieredMetaTileEntity; +import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import supersymmetry.api.SusyLog; +import supersymmetry.common.blocks.BlockSolarPanel; +import supersymmetry.common.blocks.SuSyBlocks; + +import java.util.List; + +import static gregtech.api.GTValues.LV; +import static net.minecraft.block.Block.getStateById; + + +public class MetaTileEntitySolarPanel extends TieredMetaTileEntity { + + public MetaTileEntitySolarPanel(ResourceLocation metaTileEntityId, int tier) { + super(metaTileEntityId, tier); + } + IBlockState panelDisplayBlock = SuSyBlocks.SOLAR_PANEL.getState(BlockSolarPanel.SolarPanelType.DEFAULT); + + @Override + public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEntity) { + return new MetaTileEntitySolarPanel(this.metaTileEntityId, this.getTier()); + } + + @Override + protected ModularUI createUI(EntityPlayer entityPlayer) { + return null; + } + + @Override + protected boolean openGUIOnRightClick() { + return false; + } + + @Override + protected void reinitializeEnergyContainer() { + super.reinitializeEnergyContainer(); + } + + public static boolean hasSkyAccess(@NotNull World world, @NotNull BlockPos blockPos) { + BlockPos up = blockPos.up(3); + return world.canSeeSky(up); + } + + public boolean hasSolarPanelDisplay(@NotNull World world, @NotNull BlockPos blockPos) { + BlockPos up = blockPos.up(2); + return world.getBlockState(up) == panelDisplayBlock; + } + + public boolean panelIsNotObstructed(@NotNull World world, @NotNull BlockPos blockPos) { + BlockPos up = blockPos.up(); + return world.getBlockState(up) == getStateById(0); + } + + public int getNumberOfNearbyPanels(@NotNull World world, @NotNull BlockPos blockPos) { + int numPanels = 0; + BlockPos current = blockPos.north().west().up(2); + for (int i = 0; i <= 2; i++) { + for (int j = 0; j <= 2; j++) { + if (world.getBlockState(current) == panelDisplayBlock) { + numPanels++; + } + current = current.south(); + } + current = current.north(3); + current = current.east(); + } + return numPanels - 1; + } + + @Override + public void update() { + super.update(); + World world = this.getWorld(); + long time = world.getWorldTime() % 24000; + double multiplier = 0; + if (hasSkyAccess(world, this.getPos()) && hasSolarPanelDisplay(world, this.getPos()) && + panelIsNotObstructed(world, this.getPos())) { + if (time >= 2000 && time < 10000) { //6000 is noon, 18000 is midnight + multiplier = 1; + } else if (time >= 14000 && time <= 22000) { + multiplier = 0; + } else if (time >= 10000 && time < 14000) { + multiplier = (double) (14000 - time) / 4000.0; + } else if (time < 2000) { + multiplier = (double) time / 4000.0 + 0.5; + } else { + multiplier = (double) (time - 22000) / 4000.0; + } + + Biome biome = world.getBiome(this.getPos()); + if (world.isRaining() && (biome.canRain() || biome.getEnableSnow())) { + multiplier = multiplier * 0.5; + } + multiplier *= Math.pow(0.5, getNumberOfNearbyPanels(world, this.getPos())); + multiplier = Math.clamp(multiplier, 0, 1); + } + this.energyContainer.changeEnergy(Math.round(GTValues.V[LV] * multiplier * ((double) getTier() / 2 + 0.5))); + + } + + @Override + protected boolean isEnergyEmitter() { + return true; + } + + @Override + public void addInformation(ItemStack stack, @Nullable World player, @NotNull List tooltip, + boolean advanced) { + tooltip.add(I18n.format("susy.machine.solar_panel.tooltip.info")); + tooltip.add(I18n.format("susy.machine.solar_panel.tooltip.description1")); + tooltip.add(I18n.format("susy.machine.solar_panel.tooltip.description2")); + tooltip.add(I18n.format("susy.machine.solar_panel.tooltip.description3")); + tooltip.add(I18n.format("susy.machine.solar_panel.voltage_produced", + new Object[] { (Math.toIntExact(Math.round(GTValues.V[LV] * ((double) getTier() / 2 + 0.5)))), GTValues.VNF[this.getTier()] })); + tooltip.add(I18n.format("gregtech.universal.tooltip.max_voltage_out", + new Object[] { this.energyContainer.getOutputVoltage(), GTValues.VNF[this.getTier()] })); + tooltip.add(I18n.format("gregtech.universal.tooltip.energy_storage_capacity", + new Object[] { this.energyContainer.getEnergyCapacity() })); + } + + @Override + public boolean getIsWeatherOrTerrainResistant() { + return true; + } + + @Override + public void onPlacement() { + World world = this.getWorld(); + super.onPlacement(); + if (world.getBlockState(this.getPos().up(2)) == getStateById(0)) { + world.setBlockState(this.getPos().up(2), panelDisplayBlock); + } + } + + @Override + public void onRemoval() { + World world = this.getWorld(); + super.onRemoval(); + if (world.getBlockState(this.getPos().up(2)) == panelDisplayBlock) { + world.setBlockState(this.getPos().up(2), getStateById(0)); + } + } +} diff --git a/src/main/resources/assets/gregtech/textures/blocks/solar_panel/default/default.png b/src/main/resources/assets/gregtech/textures/blocks/solar_panel/default/default.png new file mode 100644 index 0000000000000000000000000000000000000000..5729c8084974ca48bb57b53249431aad30d833e6 GIT binary patch literal 9218 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 LCR-(K7W)4H$WS*j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/susy/blockstates/solar_panel.json b/src/main/resources/assets/susy/blockstates/solar_panel.json new file mode 100644 index 000000000..5c8c60458 --- /dev/null +++ b/src/main/resources/assets/susy/blockstates/solar_panel.json @@ -0,0 +1,6 @@ +{ + "forge_marker" : 1, + "variants" : { + "variant=default": { "model": "susy:solar_panel/default" } + } +} diff --git a/src/main/resources/assets/susy/lang/en_us.lang b/src/main/resources/assets/susy/lang/en_us.lang index e75415f11..220307f89 100644 --- a/src/main/resources/assets/susy/lang/en_us.lang +++ b/src/main/resources/assets/susy/lang/en_us.lang @@ -1035,6 +1035,16 @@ susy.machine.component_scanner.pos=Error found at %s susy.machine.building_cleanroom.name=Spacecraft Component Cleanroom +# Solar panels +susy.machine.solar_panel.lv.name=Monocrystalline Silicon Solar Panel +susy.machine.solar_panel.mv.name=Multi-Junction Solar Panel +susy.machine.solar_panel.tooltip.info=May the Sun be with you. +susy.machine.solar_panel.tooltip.description1=Generates power during daylight hours, rising/falling gradually during dawn and dusk. +susy.machine.solar_panel.tooltip.description2=Production reduced by 50%% when raining and for every solar panel in the surrounding 8 blocks. +susy.machine.solar_panel.tooltip.description3=Ensure the block above the panel base is clear! +susy.machine.solar_panel.voltage_produced=§aPeak Production: §f%,d EU/t (%s§f) +tile.solar_panel.default.name=Solar Panel Display Block + # Recipemaps recipemap.coagulation_tank.name=Coagulation recipemap.latex_collector.name=Arboreal Collector diff --git a/src/main/resources/assets/susy/models/block/solar_panel/default.json b/src/main/resources/assets/susy/models/block/solar_panel/default.json new file mode 100644 index 000000000..d537cb175 --- /dev/null +++ b/src/main/resources/assets/susy/models/block/solar_panel/default.json @@ -0,0 +1,365 @@ +{ + "format_version": "1.9.0", + "credit": "Made with Blockbench", + "texture_size": [128, 128], + "textures": { + "0": "gregtech:blocks/solar_panel/default/default", + "particle": "gregtech:blocks/solar_panel/default/default" + }, + "elements": [ + { + "name": "base", + "from": [5, -16, 5], + "to": [11, -8, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [5, -16, 5]}, + "faces": { + "north": {"uv": [0.5, 6.5, 1.25, 7.5], "texture": "#0"}, + "east": {"uv": [1.25, 6.5, 2, 7.5], "texture": "#0"}, + "south": {"uv": [6.5, 6, 7.25, 7], "texture": "#0"}, + "west": {"uv": [6.75, 0, 7.5, 1], "texture": "#0"}, + "up": {"uv": [7.5, 3, 6.75, 2.25], "texture": "#0"}, + "down": {"uv": [7.25, 7, 6.5, 7.75], "texture": "#0"} + } + }, + { + "name": "pole", + "from": [6, 0, 6], + "to": [10, 13, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 0, 6]}, + "faces": { + "north": {"uv": [6, 6, 6.5, 7.625], "texture": "#0"}, + "east": {"uv": [6.25, 0, 6.75, 1.625], "texture": "#0"}, + "south": {"uv": [6.25, 1.625, 6.75, 3.25], "texture": "#0"}, + "west": {"uv": [0, 6.5, 0.5, 8.125], "texture": "#0"}, + "up": {"uv": [1.5, 8, 1, 7.5], "texture": "#0"}, + "down": {"uv": [2, 7.5, 1.5, 8], "texture": "#0"} + } + }, + { + "name": "pole", + "from": [6, -8, 6], + "to": [10, 0, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [6, -8, 6]}, + "faces": { + "north": {"uv": [7.25, 6, 7.75, 7], "texture": "#0"}, + "east": {"uv": [7.25, 7, 7.75, 8], "texture": "#0"}, + "south": {"uv": [7.5, 0, 8, 1], "texture": "#0"}, + "west": {"uv": [0.5, 7.5, 1, 8.5], "texture": "#0"}, + "up": {"uv": [6.5, 8.125, 6, 7.625], "texture": "#0"}, + "down": {"uv": [8.25, 6, 7.75, 6.5], "texture": "#0"} + } + }, + { + "name": "panelhinge", + "from": [8, 16, 7], + "to": [32, 18, 9], + "rotation": {"angle": 45, "axis": "x", "origin": [20, 17, 8]}, + "faces": { + "north": {"uv": [6.25, 3.25, 9.25, 3.5], "texture": "#0"}, + "east": {"uv": [0.75, 0, 1, 0.25], "texture": "#0"}, + "south": {"uv": [6.25, 3.5, 9.25, 3.75], "texture": "#0"}, + "west": {"uv": [1, 0, 1.25, 0.25], "texture": "#0"}, + "up": {"uv": [9.25, 4, 6.25, 3.75], "texture": "#0"}, + "down": {"uv": [9.75, 1, 6.75, 1.25], "texture": "#0"} + } + }, + { + "name": "panelhinge", + "from": [-16, 16, 7], + "to": [8, 18, 9], + "rotation": {"angle": 45, "axis": "x", "origin": [-4, 17, 8]}, + "faces": { + "north": {"uv": [6.75, 1.25, 9.75, 1.5], "texture": "#0"}, + "east": {"uv": [1.25, 0, 1.5, 0.25], "texture": "#0"}, + "south": {"uv": [6.75, 1.5, 9.75, 1.75], "texture": "#0"}, + "west": {"uv": [1.5, 0, 1.75, 0.25], "texture": "#0"}, + "up": {"uv": [9.75, 2, 6.75, 1.75], "texture": "#0"}, + "down": {"uv": [9.75, 2, 6.75, 2.25], "texture": "#0"} + } + }, + { + "name": "hingesupport", + "from": [1, 12, 7], + "to": [15, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 12, 7]}, + "faces": { + "north": {"uv": [0.5, 0.25, 2.25, 0.5], "texture": "#0"}, + "east": {"uv": [1.75, 0, 2, 0.25], "texture": "#0"}, + "south": {"uv": [6.75, 3, 8.5, 3.25], "texture": "#0"}, + "west": {"uv": [2, 0, 2.25, 0.25], "texture": "#0"}, + "up": {"uv": [9.25, 2.5, 7.5, 2.25], "texture": "#0"}, + "down": {"uv": [9.25, 2.5, 7.5, 2.75], "texture": "#0"} + } + }, + { + "name": "hingesupport", + "from": [1, 14, 7], + "to": [3, 17, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 14, 7]}, + "faces": { + "north": {"uv": [0, 0.75, 0.25, 1.125], "texture": "#0"}, + "east": {"uv": [0, 1.125, 0.25, 1.5], "texture": "#0"}, + "south": {"uv": [0, 1.5, 0.25, 1.875], "texture": "#0"}, + "west": {"uv": [0, 1.875, 0.25, 2.25], "texture": "#0"}, + "up": {"uv": [0.25, 2.5, 0, 2.25], "texture": "#0"}, + "down": {"uv": [8.25, 0.75, 8, 1], "texture": "#0"} + } + }, + { + "name": "hingesupport", + "from": [13, 14, 7], + "to": [15, 17, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [13, 14, 7]}, + "faces": { + "north": {"uv": [2, 2.5, 2.25, 2.875], "texture": "#0"}, + "east": {"uv": [2, 2.875, 2.25, 3.25], "texture": "#0"}, + "south": {"uv": [2, 3.25, 2.25, 3.625], "texture": "#0"}, + "west": {"uv": [2, 3.625, 2.25, 4], "texture": "#0"}, + "up": {"uv": [3.75, 8.25, 3.5, 8], "texture": "#0"}, + "down": {"uv": [4, 8, 3.75, 8.25], "texture": "#0"} + } + }, + { + "name": "hingesupport", + "from": [7, 14, 7], + "to": [9, 17, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 14, 7]}, + "faces": { + "north": {"uv": [2.5, 8, 2.75, 8.375], "texture": "#0"}, + "east": {"uv": [2.75, 8, 3, 8.375], "texture": "#0"}, + "south": {"uv": [3, 8, 3.25, 8.375], "texture": "#0"}, + "west": {"uv": [3.25, 8, 3.5, 8.375], "texture": "#0"}, + "up": {"uv": [4.25, 8.25, 4, 8], "texture": "#0"}, + "down": {"uv": [8.25, 4, 8, 4.25], "texture": "#0"} + } + }, + { + "name": "panel", + "from": [0, 15, 3], + "to": [16, 31, 4], + "rotation": {"angle": -45, "axis": "x", "origin": [12, 23, 3.5]}, + "faces": { + "north": {"uv": [0.25, 0.5, 2.25, 2.5], "texture": "#0"}, + "east": {"uv": [6.5, 7.75, 6.625, 9.75], "texture": "#0"}, + "south": {"uv": [2.25, 0, 4.25, 2], "texture": "#0"}, + "west": {"uv": [7.75, 6.5, 7.875, 8.5], "texture": "#0"}, + "up": {"uv": [9.5, 2.875, 7.5, 2.75], "texture": "#0"}, + "down": {"uv": [9.5, 2.875, 7.5, 3], "texture": "#0"} + } + }, + { + "name": "panel", + "from": [16, 15, 3], + "to": [32, 31, 4], + "rotation": {"angle": -45, "axis": "x", "origin": [28, 23, 3.5]}, + "faces": { + "north": {"uv": [2.25, 2, 4.25, 4], "texture": "#0"}, + "east": {"uv": [6.625, 7.75, 6.75, 9.75], "texture": "#0"}, + "south": {"uv": [0, 2.5, 2, 4.5], "texture": "#0"}, + "west": {"uv": [6.75, 7.75, 6.875, 9.75], "texture": "#0"}, + "up": {"uv": [9.875, 6.625, 7.875, 6.5], "texture": "#0"}, + "down": {"uv": [9.875, 6.625, 7.875, 6.75], "texture": "#0"} + } + }, + { + "name": "panel", + "from": [-16, 15, 3], + "to": [0, 31, 4], + "rotation": {"angle": -45, "axis": "x", "origin": [-4, 23, 3.5]}, + "faces": { + "north": {"uv": [2, 4, 4, 6], "texture": "#0"}, + "east": {"uv": [6.875, 7.75, 7, 9.75], "texture": "#0"}, + "south": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "west": {"uv": [7, 7.75, 7.125, 9.75], "texture": "#0"}, + "up": {"uv": [9.875, 6.875, 7.875, 6.75], "texture": "#0"}, + "down": {"uv": [9.875, 6.875, 7.875, 7], "texture": "#0"} + } + }, + { + "name": "panelsupport", + "from": [-16, 15, 2], + "to": [-15, 30, 3], + "rotation": {"angle": -45, "axis": "x", "origin": [-4, 23, 2.5]}, + "faces": { + "north": {"uv": [1.5, 8, 1.625, 9.875], "texture": "#0"}, + "east": {"uv": [1.625, 8, 1.75, 9.875], "texture": "#0"}, + "south": {"uv": [1.75, 8, 1.875, 9.875], "texture": "#0"}, + "west": {"uv": [1.875, 8, 2, 9.875], "texture": "#0"}, + "up": {"uv": [4.375, 8.125, 4.25, 8], "texture": "#0"}, + "down": {"uv": [8.125, 4.25, 8, 4.375], "texture": "#0"} + } + }, + { + "name": "panelsupport", + "from": [-1, 15, 2], + "to": [0, 30, 3], + "rotation": {"angle": -45, "axis": "x", "origin": [11, 23, 2.5]}, + "faces": { + "north": {"uv": [1.5, 8, 1.625, 9.875], "texture": "#0"}, + "east": {"uv": [1.625, 8, 1.75, 9.875], "texture": "#0"}, + "south": {"uv": [1.75, 8, 1.875, 9.875], "texture": "#0"}, + "west": {"uv": [1.875, 8, 2, 9.875], "texture": "#0"}, + "up": {"uv": [4.375, 8.125, 4.25, 8], "texture": "#0"}, + "down": {"uv": [8.125, 4.25, 8, 4.375], "texture": "#0"} + } + }, + { + "name": "panelsupport", + "from": [16, 15, 2], + "to": [17, 30, 3], + "rotation": {"angle": -45, "axis": "x", "origin": [28, 23, 2.5]}, + "faces": { + "north": {"uv": [1.5, 8, 1.625, 9.875], "texture": "#0"}, + "east": {"uv": [1.625, 8, 1.75, 9.875], "texture": "#0"}, + "south": {"uv": [1.75, 8, 1.875, 9.875], "texture": "#0"}, + "west": {"uv": [1.875, 8, 2, 9.875], "texture": "#0"}, + "up": {"uv": [4.375, 8.125, 4.25, 8], "texture": "#0"}, + "down": {"uv": [8.125, 4.25, 8, 4.375], "texture": "#0"} + } + }, + { + "name": "panelsupport", + "from": [31, 15, 2], + "to": [32, 30, 3], + "rotation": {"angle": -45, "axis": "x", "origin": [43, 23, 2.5]}, + "faces": { + "north": {"uv": [1.5, 8, 1.625, 9.875], "texture": "#0"}, + "east": {"uv": [1.625, 8, 1.75, 9.875], "texture": "#0"}, + "south": {"uv": [1.75, 8, 1.875, 9.875], "texture": "#0"}, + "west": {"uv": [1.875, 8, 2, 9.875], "texture": "#0"}, + "up": {"uv": [4.375, 8.125, 4.25, 8], "texture": "#0"}, + "down": {"uv": [8.125, 4.25, 8, 4.375], "texture": "#0"} + } + }, + { + "name": "panelsupport", + "from": [-16, 4, 13], + "to": [-15, 19, 14], + "rotation": {"angle": -45, "axis": "x", "origin": [-4, 12, 13.5]}, + "faces": { + "north": {"uv": [2, 8, 2.125, 9.875], "texture": "#0"}, + "east": {"uv": [2.125, 8, 2.25, 9.875], "texture": "#0"}, + "south": {"uv": [2.25, 8, 2.375, 9.875], "texture": "#0"}, + "west": {"uv": [2.375, 8, 2.5, 9.875], "texture": "#0"}, + "up": {"uv": [4.5, 8.125, 4.375, 8], "texture": "#0"}, + "down": {"uv": [8.125, 4.375, 8, 4.5], "texture": "#0"} + } + }, + { + "name": "panelsupport", + "from": [-1, 4, 13], + "to": [0, 19, 14], + "rotation": {"angle": -45, "axis": "x", "origin": [11, 12, 13.5]}, + "faces": { + "north": {"uv": [2, 8, 2.125, 9.875], "texture": "#0"}, + "east": {"uv": [2.125, 8, 2.25, 9.875], "texture": "#0"}, + "south": {"uv": [2.25, 8, 2.375, 9.875], "texture": "#0"}, + "west": {"uv": [2.375, 8, 2.5, 9.875], "texture": "#0"}, + "up": {"uv": [4.5, 8.125, 4.375, 8], "texture": "#0"}, + "down": {"uv": [8.125, 4.375, 8, 4.5], "texture": "#0"} + } + }, + { + "name": "panelsupport", + "from": [16, 4, 13], + "to": [17, 19, 14], + "rotation": {"angle": -45, "axis": "x", "origin": [28, 12, 13.5]}, + "faces": { + "north": {"uv": [2, 8, 2.125, 9.875], "texture": "#0"}, + "east": {"uv": [2.125, 8, 2.25, 9.875], "texture": "#0"}, + "south": {"uv": [2.25, 8, 2.375, 9.875], "texture": "#0"}, + "west": {"uv": [2.375, 8, 2.5, 9.875], "texture": "#0"}, + "up": {"uv": [4.5, 8.125, 4.375, 8], "texture": "#0"}, + "down": {"uv": [8.125, 4.375, 8, 4.5], "texture": "#0"} + } + }, + { + "name": "panelsupport", + "from": [31, 4, 13], + "to": [32, 19, 14], + "rotation": {"angle": -45, "axis": "x", "origin": [43, 12, 13.5]}, + "faces": { + "north": {"uv": [2, 8, 2.125, 9.875], "texture": "#0"}, + "east": {"uv": [2.125, 8, 2.25, 9.875], "texture": "#0"}, + "south": {"uv": [2.25, 8, 2.375, 9.875], "texture": "#0"}, + "west": {"uv": [2.375, 8, 2.5, 9.875], "texture": "#0"}, + "up": {"uv": [4.5, 8.125, 4.375, 8], "texture": "#0"}, + "down": {"uv": [8.125, 4.375, 8, 4.5], "texture": "#0"} + } + }, + { + "name": "panel", + "from": [-16, 4, 14], + "to": [0, 20, 15], + "rotation": {"angle": -45, "axis": "x", "origin": [-4, 12, 14.5]}, + "faces": { + "north": {"uv": [4.25, 0, 6.25, 2], "texture": "#0"}, + "east": {"uv": [7.125, 7.75, 7.25, 9.75], "texture": "#0"}, + "south": {"uv": [4.25, 2, 6.25, 4], "texture": "#0"}, + "west": {"uv": [7.875, 7, 8, 9], "texture": "#0"}, + "up": {"uv": [10, 0.125, 8, 0], "texture": "#0"}, + "down": {"uv": [10, 0.125, 8, 0.25], "texture": "#0"} + } + }, + { + "name": "panel", + "from": [0, 4, 14], + "to": [16, 20, 15], + "rotation": {"angle": -45, "axis": "x", "origin": [12, 12, 14.5]}, + "faces": { + "north": {"uv": [0, 4.5, 2, 6.5], "texture": "#0"}, + "east": {"uv": [1, 8, 1.125, 10], "texture": "#0"}, + "south": {"uv": [2, 6, 4, 8], "texture": "#0"}, + "west": {"uv": [1.125, 8, 1.25, 10], "texture": "#0"}, + "up": {"uv": [10, 0.375, 8, 0.25], "texture": "#0"}, + "down": {"uv": [10, 0.375, 8, 0.5], "texture": "#0"} + } + }, + { + "name": "panel", + "from": [16, 4, 14], + "to": [32, 20, 15], + "rotation": {"angle": -45, "axis": "x", "origin": [28, 12, 14.5]}, + "faces": { + "north": {"uv": [4, 6, 6, 8], "texture": "#0"}, + "east": {"uv": [1.25, 8, 1.375, 10], "texture": "#0"}, + "south": {"uv": [6, 4, 8, 6], "texture": "#0"}, + "west": {"uv": [1.375, 8, 1.5, 10], "texture": "#0"}, + "up": {"uv": [10, 0.625, 8, 0.5], "texture": "#0"}, + "down": {"uv": [10, 0.625, 8, 0.75], "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [0, -180, 0], + "scale": [0.2, 0.2, 0.2] + }, + "thirdperson_lefthand": { + "rotation": [0, -180, 0], + "scale": [0.2, 0.2, 0.2] + }, + "firstperson_righthand": { + "scale": [0.2, 0.2, 0.2] + }, + "firstperson_lefthand": { + "scale": [0.2, 0.2, 0.2] + }, + "ground": { + "scale": [0.15, 0.15, 0.15] + }, + "gui": { + "rotation": [0, 45, 0], + "scale": [0.3, 0.3, 0.3] + }, + "head": { + "rotation": [0, -180, 0], + "translation": [0, 8, 0], + "scale": [0.4, 0.4, 0.4] + }, + "fixed": { + "rotation": [0, 180, 0], + "scale": [0.2, 0.2, 0.2] + } + } +}