From b041599cf5e5eeb39b8fa0561624f52d1f66901a Mon Sep 17 00:00:00 2001 From: oier Date: Sat, 19 Aug 2023 22:24:52 +0200 Subject: [PATCH] model rework --- .../assets/trading_station/lang/en_ud.json | 13 -- .../assets/trading_station/lang/en_us.json | 13 -- .../compat/jei/TradingRecipeHandler.java | 4 + .../kubejs/BiomeConditionComponent.java | 2 + .../kubejs/ExclusiveToConditionComponent.java | 50 +++++ .../trading_recipe/BiomeCondition.java | 197 ++++++++++++++++++ .../trading_recipe/ExclusiveToCondition.java | 4 + .../foundation/gui/Coords2D.java | 4 + .../foundation/gui/IconButton.java | 57 +++++ .../foundation/gui/ToggleButton.java | 80 +++++++ .../render/LaserIOItemRenderer.java | 172 +++++++++++++++ .../foundation/render/RenderTypes.java | 148 ------------- .../foundation/util/MiscTools.java | 79 +++++++ .../packets/RedstoneModeSyncC2SPacket.java | 55 +++++ .../models/block/powered_trading_station.json | 4 +- .../block/powered_trading_station_lit.json | 7 + .../powered_trading_station_powered.json | 2 +- .../powered_trading_station_powered_lit.json | 7 + .../models/block/trading_station.json | 123 +++++++++-- .../models/block/trading_station_lit.json | 7 + .../models/block/trading_station_powered.json | 2 +- .../block/trading_station_powered_lit.json | 7 + .../block/powered_trading_station.png | Bin 1345 -> 860 bytes .../block/powered_trading_station_back.png | Bin 0 -> 222 bytes .../block/powered_trading_station_lit.png | Bin 0 -> 916 bytes .../block/powered_trading_station_powered.png | Bin 1463 -> 916 bytes .../powered_trading_station_powered_lit.png | Bin 0 -> 967 bytes .../textures/block/trading_station.png | Bin 857 -> 1353 bytes .../textures/block/trading_station_back.png | Bin 0 -> 286 bytes .../textures/block/trading_station_lit.png | Bin 0 -> 1414 bytes .../block/trading_station_powered.png | Bin 999 -> 1498 bytes .../block/trading_station_powered_lit.png | Bin 0 -> 1559 bytes .../textures/gui/buttons/redstonehigh.png | Bin 0 -> 3323 bytes .../textures/gui/buttons/redstoneignore.png | Bin 0 -> 3311 bytes .../textures/gui/buttons/redstonelow.png | Bin 0 -> 3303 bytes .../textures/gui/powered_trading_station.png | Bin 1378 -> 0 bytes .../textures/gui/trading_station.png | Bin 1304 -> 1505 bytes 37 files changed, 844 insertions(+), 193 deletions(-) delete mode 100644 src/generated/resources/assets/trading_station/lang/en_ud.json delete mode 100644 src/generated/resources/assets/trading_station/lang/en_us.json create mode 100644 src/main/java/com/oierbravo/trading_station/compat/jei/TradingRecipeHandler.java create mode 100644 src/main/java/com/oierbravo/trading_station/compat/kubejs/BiomeConditionComponent.java create mode 100644 src/main/java/com/oierbravo/trading_station/compat/kubejs/ExclusiveToConditionComponent.java create mode 100644 src/main/java/com/oierbravo/trading_station/content/trading_recipe/BiomeCondition.java create mode 100644 src/main/java/com/oierbravo/trading_station/content/trading_recipe/ExclusiveToCondition.java create mode 100644 src/main/java/com/oierbravo/trading_station/foundation/gui/Coords2D.java create mode 100644 src/main/java/com/oierbravo/trading_station/foundation/gui/IconButton.java create mode 100644 src/main/java/com/oierbravo/trading_station/foundation/gui/ToggleButton.java create mode 100644 src/main/java/com/oierbravo/trading_station/foundation/render/LaserIOItemRenderer.java delete mode 100644 src/main/java/com/oierbravo/trading_station/foundation/render/RenderTypes.java create mode 100644 src/main/java/com/oierbravo/trading_station/foundation/util/MiscTools.java create mode 100644 src/main/java/com/oierbravo/trading_station/network/packets/RedstoneModeSyncC2SPacket.java create mode 100644 src/main/resources/assets/trading_station/models/block/powered_trading_station_lit.json create mode 100644 src/main/resources/assets/trading_station/models/block/powered_trading_station_powered_lit.json create mode 100644 src/main/resources/assets/trading_station/models/block/trading_station_lit.json create mode 100644 src/main/resources/assets/trading_station/models/block/trading_station_powered_lit.json create mode 100644 src/main/resources/assets/trading_station/textures/block/powered_trading_station_back.png create mode 100644 src/main/resources/assets/trading_station/textures/block/powered_trading_station_lit.png create mode 100644 src/main/resources/assets/trading_station/textures/block/powered_trading_station_powered_lit.png create mode 100644 src/main/resources/assets/trading_station/textures/block/trading_station_back.png create mode 100644 src/main/resources/assets/trading_station/textures/block/trading_station_lit.png create mode 100644 src/main/resources/assets/trading_station/textures/block/trading_station_powered_lit.png create mode 100644 src/main/resources/assets/trading_station/textures/gui/buttons/redstonehigh.png create mode 100644 src/main/resources/assets/trading_station/textures/gui/buttons/redstoneignore.png create mode 100644 src/main/resources/assets/trading_station/textures/gui/buttons/redstonelow.png delete mode 100644 src/main/resources/assets/trading_station/textures/gui/powered_trading_station.png diff --git a/src/generated/resources/assets/trading_station/lang/en_ud.json b/src/generated/resources/assets/trading_station/lang/en_ud.json deleted file mode 100644 index d151f54..0000000 --- a/src/generated/resources/assets/trading_station/lang/en_ud.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "block.trading_station.powered_trading_station": "uoıʇɐʇS buıpɐɹ⟘ pǝɹǝʍoԀ", - "block.trading_station.trading_station": "uoıʇɐʇS buıpɐɹ⟘", - "config.jade.plugin_trading_station.trading_station_data": "ɐʇɐp uoıʇɐʇS buıpɐɹ⟘", - "itemGroup.trading_station": "uoıʇɐʇS buıpɐɹ⟘", - "trading_station.powered_trading_station.block.display": "uoıʇɐʇS buıpɐɹ⟘ pǝɹǝʍoԀ", - "trading_station.select_target.button": "ʇǝbɹɐʇ ʇɔǝןǝS", - "trading_station.select_target.clear": "ɹɐǝןƆ", - "trading_station.select_target.title": "ʇǝbɹɐʇ ʇndʇno uɐ ʇɔǝןǝS", - "trading_station.tooltip.progress": "%d%% :ssǝɹboɹԀ", - "trading_station.trading.recipe": "ǝdıɔǝɹ buıpɐɹ⟘", - "trading_station.trading_station.block.display": "uoıʇɐʇS buıpɐɹ⟘" -} \ No newline at end of file diff --git a/src/generated/resources/assets/trading_station/lang/en_us.json b/src/generated/resources/assets/trading_station/lang/en_us.json deleted file mode 100644 index 7fa54cd..0000000 --- a/src/generated/resources/assets/trading_station/lang/en_us.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "block.trading_station.powered_trading_station": "Powered Trading Station", - "block.trading_station.trading_station": "Trading Station", - "config.jade.plugin_trading_station.trading_station_data": "Trading Station data", - "itemGroup.trading_station": "Trading Station", - "trading_station.powered_trading_station.block.display": "Powered Trading Station", - "trading_station.select_target.button": "Select target", - "trading_station.select_target.clear": "Clear", - "trading_station.select_target.title": "Select an output target", - "trading_station.tooltip.progress": "Progress: %d%%", - "trading_station.trading.recipe": "Trading recipe", - "trading_station.trading_station.block.display": "Trading Station" -} \ No newline at end of file diff --git a/src/main/java/com/oierbravo/trading_station/compat/jei/TradingRecipeHandler.java b/src/main/java/com/oierbravo/trading_station/compat/jei/TradingRecipeHandler.java new file mode 100644 index 0000000..3b454b7 --- /dev/null +++ b/src/main/java/com/oierbravo/trading_station/compat/jei/TradingRecipeHandler.java @@ -0,0 +1,4 @@ +package com.oierbravo.trading_station.compat.jei; + +public class TradingRecipeHandler { +} diff --git a/src/main/java/com/oierbravo/trading_station/compat/kubejs/BiomeConditionComponent.java b/src/main/java/com/oierbravo/trading_station/compat/kubejs/BiomeConditionComponent.java new file mode 100644 index 0000000..4bc9d17 --- /dev/null +++ b/src/main/java/com/oierbravo/trading_station/compat/kubejs/BiomeConditionComponent.java @@ -0,0 +1,2 @@ +package com.oierbravo.trading_station.compat.kubejs;public class BiomeConditionComponent { +} diff --git a/src/main/java/com/oierbravo/trading_station/compat/kubejs/ExclusiveToConditionComponent.java b/src/main/java/com/oierbravo/trading_station/compat/kubejs/ExclusiveToConditionComponent.java new file mode 100644 index 0000000..78530e8 --- /dev/null +++ b/src/main/java/com/oierbravo/trading_station/compat/kubejs/ExclusiveToConditionComponent.java @@ -0,0 +1,50 @@ +package com.oierbravo.trading_station.compat.kubejs; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.oierbravo.trading_station.content.trading_recipe.BiomeCondition; +import dev.latvian.mods.kubejs.recipe.RecipeJS; +import dev.latvian.mods.kubejs.recipe.component.ComponentRole; +import dev.latvian.mods.kubejs.recipe.component.RecipeComponent; +import dev.latvian.mods.rhino.NativeObject; +import net.minecraft.world.level.biome.Biome; + +public class ExclusiveToConditionComponent implements RecipeComponent { + public static final RecipeComponent BIOME_CONDITION= new ExclusiveToConditionComponent(); + + public ComponentRole role() { + return ComponentRole.OTHER; + } + + @Override + public Class componentClass() { + return BiomeCondition.class; + } + + @Override + public JsonElement write(RecipeJS recipe, BiomeCondition value) { + return value.toJson(); + } + + private BiomeCondition fromNativeObject(NativeObject nativeObject ){ + if(nativeObject.containsKey("tag")) + return BiomeCondition.fromString("#" + nativeObject.get("tag")); + return BiomeCondition.fromString(nativeObject.get("name").toString()); + } + @Override + public BiomeCondition read(RecipeJS recipe, Object from) { + if (from instanceof BiomeCondition bc) { + return bc; + + } else if (from instanceof Biome b) { + return BiomeCondition.fromBiome(b); + } else if (from instanceof JsonObject je) { + return BiomeCondition.fromJson(je); + } else if(from instanceof NativeObject no){ + return fromNativeObject(no); + + } else { + return BiomeCondition.fromString(String.valueOf(from)); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/oierbravo/trading_station/content/trading_recipe/BiomeCondition.java b/src/main/java/com/oierbravo/trading_station/content/trading_recipe/BiomeCondition.java new file mode 100644 index 0000000..77805a0 --- /dev/null +++ b/src/main/java/com/oierbravo/trading_station/content/trading_recipe/BiomeCondition.java @@ -0,0 +1,197 @@ +package com.oierbravo.trading_station.content.trading_recipe; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSyntaxException; +import net.minecraft.core.Registry; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.biome.Biome; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.IForgeRegistry; + +import javax.annotation.Nullable; +import java.util.List; +import java.util.Objects; + +public class BiomeCondition { + public static final BiomeCondition EMPTY = new BiomeCondition(); + + protected Biome biome; + + public static BiomeCondition fromTag(TagKey tag) { + BiomeTagCondition condition = new BiomeTagCondition(); + condition.tag = tag; + return condition; + } + + public static BiomeCondition fromBiome(Biome biome) { + BiomeCondition condition = new BiomeCondition(); + condition.biome = biome; + return condition; + } + + public static BiomeCondition fromString(String biome) { + if(Objects.equals(biome, "Any")){ + return BiomeCondition.EMPTY; + } + + if(biome.startsWith("#")){ + var tagManager = ForgeRegistries.BIOMES.tags(); + var tagKey = tagManager.createTagKey(new ResourceLocation(biome.replace("#",""))); + var tag = tagManager.getTag(tagKey); + BiomeTagCondition tagCondition = new BiomeTagCondition(); + tagCondition.tag = tagKey; + return tagCondition; + } + + BiomeCondition condition = new BiomeCondition(); + ResourceLocation id = new ResourceLocation(biome); + condition.biome = ForgeRegistries.BIOMES.getValue(id); + return condition; + } + + + protected void readInternal(FriendlyByteBuf buffer){ + biome = buffer.readRegistryId(); + }; + + protected void writeInternal(FriendlyByteBuf buffer){ + buffer.writeRegistryId(ForgeRegistries.BIOMES, biome); + }; + + protected void readInternal(JsonObject json){ + ResourceLocation id = new ResourceLocation(GsonHelper.getAsString(json, "name")); + biome = ForgeRegistries.BIOMES.getValue(id); + if (biome == null) + throw new JsonSyntaxException("Unknown biome '" + id + "'"); + }; + + protected void writeInternal(JsonObject json){ + json.addProperty("name", getKeyOrThrow(biome) + .toString()); + }; + public static ResourceLocation getKeyOrThrow(IForgeRegistry registry, V value) { + ResourceLocation key = registry.getKey(value); + if (key == null) { + throw new IllegalArgumentException("Could not get key for value " + value + "!"); + } + return key; + } + public static ResourceLocation getKeyOrThrow(Biome value) { + ResourceLocation key = ForgeRegistries.BIOMES.getKey(value); + if (key == null) { + throw new IllegalArgumentException("Could not get key for value " + value + "!"); + } + return key; + } + public boolean test(Biome b, LevelAccessor pLevel) { + if (b == null) + throw new IllegalArgumentException("Biome cannot be null"); + return testInternal(b, pLevel); + } + protected boolean testInternal(Biome b, LevelAccessor pLevel){ + if(biome == null) + return false; + if (biome.toString() != b.toString()) + return false; + return true; + }; + + public void write(FriendlyByteBuf buffer) { + buffer.writeBoolean(this instanceof BiomeTagCondition); + writeInternal(buffer); + } + + public static BiomeCondition read(FriendlyByteBuf buffer) { + boolean isTagBiome = buffer.readBoolean(); + BiomeCondition biome = isTagBiome ? new BiomeTagCondition() : new BiomeCondition(); + biome.readInternal(buffer); + return biome; + } + public JsonObject serialize() { + JsonObject json = new JsonObject(); + writeInternal(json); + return json; + } + + public static boolean isBiomeCondition(@Nullable JsonElement je) { + if (je == null || je.isJsonNull()) + return false; + if (!je.isJsonObject()) + return false; + JsonObject json = je.getAsJsonObject(); + if (json.has("tag")) + return true; + else if (json.has("name")) + return true; + return false; + } + + public static BiomeCondition deserialize(@Nullable JsonElement je) { + if (!isBiomeCondition(je)) + throw new JsonSyntaxException("Invalid biome condition: " + Objects.toString(je)); + + JsonObject json = je.getAsJsonObject(); + BiomeCondition condition = json.has("tag") ? new BiomeTagCondition() : new BiomeCondition(); + condition.readInternal(json); + + return condition; + } + public String toString(){ + return toStringInternal(); + } + + protected String toStringInternal(){ + if(biome == null) + return "Any"; + return ForgeRegistries.BIOMES.getKey(biome).toString(); + } + + public static class BiomeTagCondition extends BiomeCondition { + + protected TagKey tag; + protected List matchingBiomes; + + @Override + protected boolean testInternal(Biome b, LevelAccessor pLevel) { + Registry biomeRegistry = pLevel.registryAccess().registryOrThrow(ForgeRegistries.BIOMES.getRegistryKey()); + ResourceKey key = biomeRegistry.getResourceKey(b).get(); + boolean result = biomeRegistry.getOrCreateTag(tag).contains(biomeRegistry.getOrCreateHolderOrThrow(key)); + return biomeRegistry.getOrCreateTag(tag).contains(biomeRegistry.getOrCreateHolderOrThrow(key)); + } + + + @Override + protected void readInternal(FriendlyByteBuf buffer) { + ResourceLocation resourceLocation = buffer.readResourceLocation(); + tag = TagKey.create(Registry.BIOME_REGISTRY, resourceLocation); + } + + @Override + protected void writeInternal(FriendlyByteBuf buffer) { + buffer.writeResourceLocation(tag.location()); + } + + @Override + protected void readInternal(JsonObject json) { + ResourceLocation resourceLocation = new ResourceLocation(GsonHelper.getAsString(json, "tag")); + tag = TagKey.create(Registry.BIOME_REGISTRY, resourceLocation); + } + + @Override + protected void writeInternal(JsonObject json) { + json.addProperty("tag", tag.location() + .toString()); + } + + @Override + protected String toStringInternal(){ + return "#" + tag.location().toString(); + } + } +} diff --git a/src/main/java/com/oierbravo/trading_station/content/trading_recipe/ExclusiveToCondition.java b/src/main/java/com/oierbravo/trading_station/content/trading_recipe/ExclusiveToCondition.java new file mode 100644 index 0000000..666f9b2 --- /dev/null +++ b/src/main/java/com/oierbravo/trading_station/content/trading_recipe/ExclusiveToCondition.java @@ -0,0 +1,4 @@ +package com.oierbravo.trading_station.content.trading_recipe; + +public class ExclusiveToCondition { +} diff --git a/src/main/java/com/oierbravo/trading_station/foundation/gui/Coords2D.java b/src/main/java/com/oierbravo/trading_station/foundation/gui/Coords2D.java new file mode 100644 index 0000000..72e88fb --- /dev/null +++ b/src/main/java/com/oierbravo/trading_station/foundation/gui/Coords2D.java @@ -0,0 +1,4 @@ +package com.oierbravo.trading_station.foundation.gui; + +public class Coords2D { +} diff --git a/src/main/java/com/oierbravo/trading_station/foundation/gui/IconButton.java b/src/main/java/com/oierbravo/trading_station/foundation/gui/IconButton.java new file mode 100644 index 0000000..ee08c58 --- /dev/null +++ b/src/main/java/com/oierbravo/trading_station/foundation/gui/IconButton.java @@ -0,0 +1,57 @@ +package com.oierbravo.trading_station.foundation.gui; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.narration.NarrationElementOutput; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +/** + * Copyright: Direwolf20 + * Source: https://github.com/Direwolf20-MC/LaserIO + * License: MIT + */ +public class IconButton extends Button { + private ResourceLocation texture; + + public IconButton(int x, int y, int width, int height, ResourceLocation texture, OnPress onPress) { + super(x, y, width, height, Component.empty(), onPress); + + this.texture = texture; + } + + public IconButton(int x, int y, int width, int height, ResourceLocation texture, OnPress onPress, OnTooltip onTooltip) { + super(x, y, width, height, Component.empty(), onPress, onTooltip); + + this.texture = texture; + } + + @Override + public void render(PoseStack stack, int mouseX, int mouseY, float partialTicks) { + RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.setShaderColor(1f, 1f, 1f, 1f); + RenderSystem.setShaderTexture(0, texture); + blit(stack, this.x, this.y, 0, 0, width, height, width, height); + } + + @Override + public void renderToolTip(PoseStack stack, int x, int y) { + super.renderToolTip(stack, x, y); + } + + @Override + public void onClick(double p_onClick_1_, double p_onClick_3_) { + super.onClick(p_onClick_1_, p_onClick_3_); + } + + @Override + public boolean mouseClicked(double x, double y, int button) { + return super.mouseClicked(x, y, button); + } + + @Override + public void updateNarration(NarrationElementOutput p_169152_) { + + } +} diff --git a/src/main/java/com/oierbravo/trading_station/foundation/gui/ToggleButton.java b/src/main/java/com/oierbravo/trading_station/foundation/gui/ToggleButton.java new file mode 100644 index 0000000..d1a756c --- /dev/null +++ b/src/main/java/com/oierbravo/trading_station/foundation/gui/ToggleButton.java @@ -0,0 +1,80 @@ +package com.oierbravo.trading_station.foundation.gui; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.narration.NarrationElementOutput; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; + +/** + * Copyright: Direwolf20 + * Source: https://github.com/Direwolf20-MC/LaserIO + * License: MIT + */ +public class ToggleButton extends Button { + private ResourceLocation[] textures; + private int texturePosition; + + public ToggleButton(int x, int y, int width, int height, ResourceLocation[] textures, int texturePosition, OnPress onPress) { + super(x, y, width, height, Component.empty(), onPress); + + this.textures = textures; + setTexturePosition(texturePosition); + } + + public ToggleButton(int x, int y, int width, int height, ResourceLocation[] textures, int texturePosition, OnPress onPress, OnTooltip onTooltip) { + super(x, y, width, height, Component.empty(), onPress, onTooltip); + + this.textures = textures; + setTexturePosition(texturePosition); + } + + @Override + public void render(PoseStack stack, int mouseX, int mouseY, float partialTicks) { + //fill(stack, this.x, this.y, this.x + this.width, this.y + this.height, 0xFFa8a8a8); + RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.setShaderColor(1f, 1f, 1f, 1f); + RenderSystem.setShaderTexture(0, textures[texturePosition]); + blit(stack, this.x, this.y, 0, 0, width, height, width, height); + } + + @Override + public void renderToolTip(PoseStack stack, int x, int y) { + super.renderToolTip(stack, x, y); + } + + @Override + public void onClick(double p_onClick_1_, double p_onClick_3_) { + super.onClick(p_onClick_1_, p_onClick_3_); + } + + @Override + public boolean mouseClicked(double x, double y, int button) { + return super.mouseClicked(x, y, button); + } + + @Override + public void updateNarration(NarrationElementOutput p_169152_) { + + } + + public int getTexturePosition() { + return texturePosition; + } + + public void setTexturePosition(int texturePosition) { + if (texturePosition > textures.length) + this.texturePosition = textures.length; + else + this.texturePosition = texturePosition; + } + + public void nextTexturePosition() { + if (texturePosition == textures.length) + texturePosition = 0; + else + texturePosition++; + } +} diff --git a/src/main/java/com/oierbravo/trading_station/foundation/render/LaserIOItemRenderer.java b/src/main/java/com/oierbravo/trading_station/foundation/render/LaserIOItemRenderer.java new file mode 100644 index 0000000..d6ed278 --- /dev/null +++ b/src/main/java/com/oierbravo/trading_station/foundation/render/LaserIOItemRenderer.java @@ -0,0 +1,172 @@ +package com.oierbravo.trading_station.foundation.render; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.platform.Lighting; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.*; +import net.minecraft.client.Minecraft; +import net.minecraft.client.color.item.ItemColors; +import net.minecraft.client.gui.Font; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.ModelManager; +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; + +import javax.annotation.Nullable; + +/** This class is used to make the numbers on items in the FilterCountContainer smaller when greater than 100 **/ +public class LaserIOItemRenderer extends ItemRenderer { + public LaserIOItemRenderer(TextureManager textureManager, ModelManager modelManager, ItemColors itemColors, BlockEntityWithoutLevelRenderer blockEntityWithoutLevelRenderer) { + super(textureManager, modelManager, itemColors, blockEntityWithoutLevelRenderer); + } + + private void fillRect(BufferBuilder p_115153_, int p_115154_, int p_115155_, int p_115156_, int p_115157_, int p_115158_, int p_115159_, int p_115160_, int p_115161_) { + RenderSystem.setShader(GameRenderer::getPositionColorShader); + p_115153_.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + p_115153_.vertex((double) (p_115154_ + 0), (double) (p_115155_ + 0), 0.0D).color(p_115158_, p_115159_, p_115160_, p_115161_).endVertex(); + p_115153_.vertex((double) (p_115154_ + 0), (double) (p_115155_ + p_115157_), 0.0D).color(p_115158_, p_115159_, p_115160_, p_115161_).endVertex(); + p_115153_.vertex((double) (p_115154_ + p_115156_), (double) (p_115155_ + p_115157_), 0.0D).color(p_115158_, p_115159_, p_115160_, p_115161_).endVertex(); + p_115153_.vertex((double) (p_115154_ + p_115156_), (double) (p_115155_ + 0), 0.0D).color(p_115158_, p_115159_, p_115160_, p_115161_).endVertex(); + //p_115153_.end(); + BufferUploader.drawWithShader(p_115153_.end()); + } + + @Override + public void renderGuiItemDecorations(Font font, ItemStack itemstack, int x, int y, @Nullable String altText) { + if (!itemstack.isEmpty()) { + PoseStack posestack = new PoseStack(); + if (itemstack.getCount() != 1 || altText != null) { + String textToDraw = altText == null ? String.valueOf(itemstack.getCount()) : altText; + posestack.translate(0.0D, 0.0D, (double) (this.blitOffset + 200.0F)); + MultiBufferSource.BufferSource multibuffersource$buffersource = MultiBufferSource.immediate(Tesselator.getInstance().getBuilder()); + if (itemstack.getCount() > 99) { + posestack.pushPose(); + posestack.translate(x, y, 300); + posestack.scale(0.65f, 0.65f, 0.65f); + font.drawInBatch(textToDraw, (float) (17 - font.width(textToDraw) * 0.65f), (float) (17), 16777215, true, posestack.last().pose(), multibuffersource$buffersource, false, 0, 15728880); + posestack.popPose(); + } else { + font.drawInBatch(textToDraw, (float) (x + 19 - 2 - font.width(textToDraw)), (float) (y + 6 + 3), 16777215, true, posestack.last().pose(), multibuffersource$buffersource, false, 0, 15728880); + } + multibuffersource$buffersource.endBatch(); + } + + if (itemstack.isBarVisible()) { + RenderSystem.disableDepthTest(); + RenderSystem.disableTexture(); + RenderSystem.disableBlend(); + Tesselator tesselator = Tesselator.getInstance(); + BufferBuilder bufferbuilder = tesselator.getBuilder(); + int i = itemstack.getBarWidth(); + int j = itemstack.getBarColor(); + this.fillRect(bufferbuilder, x + 2, y + 13, 13, 2, 0, 0, 0, 255); + this.fillRect(bufferbuilder, x + 2, y + 13, i, 1, j >> 16 & 255, j >> 8 & 255, j & 255, 255); + RenderSystem.enableBlend(); + RenderSystem.enableTexture(); + RenderSystem.enableDepthTest(); + } + + LocalPlayer localplayer = Minecraft.getInstance().player; + float f = localplayer == null ? 0.0F : localplayer.getCooldowns().getCooldownPercent(itemstack.getItem(), Minecraft.getInstance().getFrameTime()); + if (f > 0.0F) { + RenderSystem.disableDepthTest(); + RenderSystem.disableTexture(); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + Tesselator tesselator1 = Tesselator.getInstance(); + BufferBuilder bufferbuilder1 = tesselator1.getBuilder(); + this.fillRect(bufferbuilder1, x, y + Mth.floor(16.0F * (1.0F - f)), 16, Mth.ceil(16.0F * f), 255, 255, 255, 127); + RenderSystem.enableTexture(); + RenderSystem.enableDepthTest(); + } + + } + } + + public void renderGuiItemDecorations(Font font, ItemStack itemstack, int x, int y, @Nullable String altText, float scale) { + if (!itemstack.isEmpty()) { + PoseStack posestack = new PoseStack(); + if (itemstack.getCount() != 1 || altText != null) { + String textToDraw = altText == null ? String.valueOf(itemstack.getCount()) : altText; + posestack.translate(0.0D, 0.0D, (double) (this.blitOffset + 600.0F)); + MultiBufferSource.BufferSource multibuffersource$buffersource = MultiBufferSource.immediate(Tesselator.getInstance().getBuilder()); + posestack.pushPose(); + posestack.translate(0, y, 300); + posestack.scale(scale, scale, scale); + font.drawInBatch(textToDraw, (float) (x + 13 - font.width(textToDraw) * scale) / scale, (float) (17), 16777215, true, posestack.last().pose(), multibuffersource$buffersource, false, 0, 15728880); + posestack.popPose(); + multibuffersource$buffersource.endBatch(); + } + + if (itemstack.isBarVisible()) { + RenderSystem.disableDepthTest(); + RenderSystem.disableTexture(); + RenderSystem.disableBlend(); + Tesselator tesselator = Tesselator.getInstance(); + BufferBuilder bufferbuilder = tesselator.getBuilder(); + int i = itemstack.getBarWidth(); + int j = itemstack.getBarColor(); + this.fillRect(bufferbuilder, x + 2, y + 13, 13, 2, 0, 0, 0, 255); + this.fillRect(bufferbuilder, x + (int) (2 / scale), y + 13, (int) (i * scale), 1, j >> 16 & 255, j >> 8 & 255, j & 255, 255); + RenderSystem.enableBlend(); + RenderSystem.enableTexture(); + RenderSystem.enableDepthTest(); + } + + LocalPlayer localplayer = Minecraft.getInstance().player; + float f = localplayer == null ? 0.0F : localplayer.getCooldowns().getCooldownPercent(itemstack.getItem(), Minecraft.getInstance().getFrameTime()); + if (f > 0.0F) { + RenderSystem.disableDepthTest(); + RenderSystem.disableTexture(); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + Tesselator tesselator1 = Tesselator.getInstance(); + BufferBuilder bufferbuilder1 = tesselator1.getBuilder(); + this.fillRect(bufferbuilder1, x, y + Mth.floor(16.0F * (1.0F - f)), 16, Mth.ceil(16.0F * f), 255, 255, 255, 127); + RenderSystem.enableTexture(); + RenderSystem.enableDepthTest(); + } + + } + } + + public void renderGuiItem(float scale, ItemStack p_115128_, int p_115129_, int p_115130_, BakedModel p_115131_) { + Minecraft.getInstance().getTextureManager().getTexture(TextureAtlas.LOCATION_BLOCKS).setFilter(false, false); + RenderSystem.setShaderTexture(0, TextureAtlas.LOCATION_BLOCKS); + RenderSystem.enableBlend(); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + PoseStack posestack = RenderSystem.getModelViewStack(); + posestack.pushPose(); + posestack.translate((double) p_115129_, (double) p_115130_, (double) (500.0F + this.blitOffset)); + posestack.translate(8.0D, 8.0D, 0.0D); + posestack.scale(1.0F, -1.0F, 1.0F); + posestack.scale(scale, scale, scale); + RenderSystem.applyModelViewMatrix(); + PoseStack posestack1 = new PoseStack(); + MultiBufferSource.BufferSource multibuffersource$buffersource = Minecraft.getInstance().renderBuffers().bufferSource(); + boolean flag = !p_115131_.usesBlockLight(); + if (flag) { + Lighting.setupForFlatItems(); + } + + this.render(p_115128_, ItemTransforms.TransformType.GUI, false, posestack1, multibuffersource$buffersource, 15728880, OverlayTexture.NO_OVERLAY, p_115131_); + multibuffersource$buffersource.endBatch(); + RenderSystem.enableDepthTest(); + if (flag) { + Lighting.setupFor3DItems(); + } + + posestack.popPose(); + RenderSystem.applyModelViewMatrix(); + } +} diff --git a/src/main/java/com/oierbravo/trading_station/foundation/render/RenderTypes.java b/src/main/java/com/oierbravo/trading_station/foundation/render/RenderTypes.java deleted file mode 100644 index 25abb94..0000000 --- a/src/main/java/com/oierbravo/trading_station/foundation/render/RenderTypes.java +++ /dev/null @@ -1,148 +0,0 @@ -package com.oierbravo.trading_station.foundation.render; - -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.VertexFormat; -import com.oierbravo.trading_station.TradingStation; -import net.minecraft.client.renderer.RenderStateShard; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.ShaderInstance; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.resources.ResourceManager; -import net.minecraft.world.inventory.InventoryMenu; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.RegisterShadersEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod.EventBusSubscriber; - -import java.io.IOException; - -// TODO 1.17: use custom shaders instead of vanilla ones -public class RenderTypes extends RenderStateShard { - - public static final ShaderStateShard GLOWING_SHADER = new ShaderStateShard(() -> Shaders.glowingShader); - - - - - public static RenderType getOutlineTranslucent(ResourceLocation texture, boolean cull) { - return RenderType.create(createLayerName("outline_translucent" + (cull ? "_cull" : "")), - DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, false, true, RenderType.CompositeState.builder() - .setShaderState(cull ? RENDERTYPE_ENTITY_TRANSLUCENT_CULL_SHADER : RENDERTYPE_ENTITY_TRANSLUCENT_SHADER) - .setTextureState(new TextureStateShard(texture, false, false)) - .setTransparencyState(TRANSLUCENT_TRANSPARENCY) - .setCullState(cull ? CULL : NO_CULL) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .setWriteMaskState(COLOR_WRITE) - .createCompositeState(false)); - } - - public static RenderType getGlowingSolid(ResourceLocation texture) { - return RenderType.create(createLayerName("glowing_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, - true, false, RenderType.CompositeState.builder() - .setShaderState(GLOWING_SHADER) - .setTextureState(new TextureStateShard(texture, false, false)) - .setCullState(CULL) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .createCompositeState(true)); - } - - private static final RenderType GLOWING_SOLID_DEFAULT = getGlowingSolid(InventoryMenu.BLOCK_ATLAS); - - public static RenderType getGlowingSolid() { - return GLOWING_SOLID_DEFAULT; - } - - public static RenderType getGlowingTranslucent(ResourceLocation texture) { - return RenderType.create(createLayerName("glowing_translucent"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, - 256, true, true, RenderType.CompositeState.builder() - .setShaderState(GLOWING_SHADER) - .setTextureState(new TextureStateShard(texture, false, false)) - .setTransparencyState(TRANSLUCENT_TRANSPARENCY) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .createCompositeState(true)); - } - - private static final RenderType ADDITIVE = RenderType.create(createLayerName("additive"), DefaultVertexFormat.BLOCK, - VertexFormat.Mode.QUADS, 256, true, true, RenderType.CompositeState.builder() - .setShaderState(BLOCK_SHADER) - .setTextureState(new TextureStateShard(InventoryMenu.BLOCK_ATLAS, false, false)) - .setTransparencyState(ADDITIVE_TRANSPARENCY) - .setCullState(NO_CULL) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .createCompositeState(true)); - - public static RenderType getAdditive() { - return ADDITIVE; - } - - private static final RenderType GLOWING_TRANSLUCENT_DEFAULT = getGlowingTranslucent(InventoryMenu.BLOCK_ATLAS); - - public static RenderType getGlowingTranslucent() { - return GLOWING_TRANSLUCENT_DEFAULT; - } - - private static final RenderType ITEM_PARTIAL_SOLID = - RenderType.create(createLayerName("item_partial_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, - false, RenderType.CompositeState.builder() - .setShaderState(RENDERTYPE_ENTITY_SOLID_SHADER) - .setTextureState(BLOCK_SHEET) - .setCullState(CULL) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .createCompositeState(true)); - - public static RenderType getItemPartialSolid() { - return ITEM_PARTIAL_SOLID; - } - - private static final RenderType ITEM_PARTIAL_TRANSLUCENT = RenderType.create(createLayerName("item_partial_translucent"), - DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, true, RenderType.CompositeState.builder() - .setShaderState(RENDERTYPE_ENTITY_TRANSLUCENT_CULL_SHADER) - .setTextureState(BLOCK_SHEET) - .setTransparencyState(TRANSLUCENT_TRANSPARENCY) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .createCompositeState(true)); - - public static RenderType getItemPartialTranslucent() { - return ITEM_PARTIAL_TRANSLUCENT; - } - - private static final RenderType FLUID = RenderType.create(createLayerName("fluid"), - DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, false, true, RenderType.CompositeState.builder() - .setShaderState(RENDERTYPE_ENTITY_TRANSLUCENT_CULL_SHADER) - .setTextureState(BLOCK_SHEET_MIPPED) - .setTransparencyState(TRANSLUCENT_TRANSPARENCY) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .createCompositeState(true)); - - public static RenderType getFluid() { - return FLUID; - } - - private static String createLayerName(String name) { - return TradingStation.MODID + ":" + name; - } - - // Mmm gimme those protected fields - private RenderTypes() { - super(null, null, null); - } - - @EventBusSubscriber(value = Dist.CLIENT, bus = EventBusSubscriber.Bus.MOD) - private static class Shaders { - private static ShaderInstance glowingShader; - - /*@SubscribeEvent - public static void onRegisterShaders(RegisterShadersEvent event) throws IOException { - ResourceManager resourceManager = event.getResourceManager(); - event.registerShader(new ShaderInstance(resourceManager, TradingStation.asResource("glowing_shader"), DefaultVertexFormat.NEW_ENTITY), shader -> glowingShader = shader); - }*/ - } - -} diff --git a/src/main/java/com/oierbravo/trading_station/foundation/util/MiscTools.java b/src/main/java/com/oierbravo/trading_station/foundation/util/MiscTools.java new file mode 100644 index 0000000..be6c818 --- /dev/null +++ b/src/main/java/com/oierbravo/trading_station/foundation/util/MiscTools.java @@ -0,0 +1,79 @@ +package com.oierbravo.trading_station.foundation.util; + +import com.mojang.math.Vector3f; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; + +import java.util.ArrayList; +import java.util.List; + +/** + * Copyright: Direwolf20 + * Source: https://github.com/Direwolf20-MC/LaserIO + * License: MIT + */ +public class MiscTools { + public static boolean inBounds(int x, int y, int w, int h, double ox, double oy) { + return ox >= x && ox <= x + w && oy >= y && oy <= y + h; + } + + public static Vector3f findOffset(Direction direction, int slot, Vector3f[] offsets) { + Vector3f offsetVector = offsets[slot].copy(); + switch (direction) { + case UP -> { + offsetVector.transform(Vector3f.XP.rotationDegrees(-270)); + offsetVector.add(0, 1, 0); + } + case DOWN -> { + offsetVector.transform(Vector3f.XP.rotationDegrees(-90)); + offsetVector.add(0, 0, 1); + //reverse = false; + } + //case NORTH -> offsetVector; + case EAST -> { + offsetVector.transform(Vector3f.YP.rotationDegrees(-90)); + offsetVector.add(1, 0, 0); + } + case SOUTH -> { + offsetVector.transform(Vector3f.YP.rotationDegrees(-180)); + offsetVector.add(1, 0, 1); + } + case WEST -> { + offsetVector.transform(Vector3f.YP.rotationDegrees(-270)); + offsetVector.add(0, 0, 1); + } + } + return offsetVector; + } + + public static ListTag stringListToNBT(List list) { + ListTag nbtList = new ListTag(); + for (String string : list) { + CompoundTag tag = new CompoundTag(); + tag.putString("list", string); + nbtList.add(tag); + } + return nbtList; + } + + public static List NBTToStringList(ListTag nbtList) { + List list = new ArrayList<>(); + for (int i = 0; i < nbtList.size(); i++) { + CompoundTag tag = nbtList.getCompound(i); + list.add(tag.getString("list")); + } + return list; + } + + public static MutableComponent tooltipMaker(String string, int color) { + Style style = Style.EMPTY; + style = style.withColor(color); + MutableComponent current = Component.translatable(string); + current.setStyle(style); + return current; + } +} \ No newline at end of file diff --git a/src/main/java/com/oierbravo/trading_station/network/packets/RedstoneModeSyncC2SPacket.java b/src/main/java/com/oierbravo/trading_station/network/packets/RedstoneModeSyncC2SPacket.java new file mode 100644 index 0000000..490ae26 --- /dev/null +++ b/src/main/java/com/oierbravo/trading_station/network/packets/RedstoneModeSyncC2SPacket.java @@ -0,0 +1,55 @@ +package com.oierbravo.trading_station.network.packets; + +import com.oierbravo.trading_station.content.trading_station.ITradingStationBlockEntity; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent; + +import java.util.function.Supplier; + +public class RedstoneModeSyncC2SPacket { + private final byte mode; + private final BlockPos pos; + + public RedstoneModeSyncC2SPacket(byte mode, BlockPos pos) { + this.mode = mode; + this.pos = pos; + + } + + public RedstoneModeSyncC2SPacket(FriendlyByteBuf buf) { + this.mode = buf.readByte(); + this.pos = buf.readBlockPos(); + + } + + public void toBytes(FriendlyByteBuf buf) { + buf.writeByte(mode); + buf.writeBlockPos(pos); + + } + + public static void handle(RedstoneModeSyncC2SPacket message, Supplier supplier) { + NetworkEvent.Context context = supplier.get(); + + context.enqueueWork(() -> { + ServerPlayer sender = context.getSender(); + if (sender == null) + return; + + AbstractContainerMenu container = sender.containerMenu; + if (container == null) + return; + + if(sender.getLevel().getBlockEntity(message.pos) instanceof ITradingStationBlockEntity blockEntity) { + blockEntity.setRedstoneMode(message.mode); + blockEntity.setChanged(); + + } + }); + context.setPacketHandled(true); + } +} diff --git a/src/main/resources/assets/trading_station/models/block/powered_trading_station.json b/src/main/resources/assets/trading_station/models/block/powered_trading_station.json index 6350804..2f6b92c 100644 --- a/src/main/resources/assets/trading_station/models/block/powered_trading_station.json +++ b/src/main/resources/assets/trading_station/models/block/powered_trading_station.json @@ -2,6 +2,8 @@ "credit": "Made with Blockbench", "parent": "trading_station:block/trading_station", "textures": { - "3": "trading_station:block/powered_trading_station" + "base": "trading_station:block/powered_trading_station", + "back": "trading_station:block/powered_trading_station_base", + "particle": "trading_station:block/powered_trading_station_base" } } \ No newline at end of file diff --git a/src/main/resources/assets/trading_station/models/block/powered_trading_station_lit.json b/src/main/resources/assets/trading_station/models/block/powered_trading_station_lit.json new file mode 100644 index 0000000..9d4a0d6 --- /dev/null +++ b/src/main/resources/assets/trading_station/models/block/powered_trading_station_lit.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench", + "parent": "trading_station:block/powered_trading_station", + "textures": { + "base": "trading_station:block/powered_trading_station_lit" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/trading_station/models/block/powered_trading_station_powered.json b/src/main/resources/assets/trading_station/models/block/powered_trading_station_powered.json index 2143999..07bcf8b 100644 --- a/src/main/resources/assets/trading_station/models/block/powered_trading_station_powered.json +++ b/src/main/resources/assets/trading_station/models/block/powered_trading_station_powered.json @@ -2,6 +2,6 @@ "credit": "Made with Blockbench", "parent": "trading_station:block/powered_trading_station", "textures": { - "3": "trading_station:block/powered_trading_station_powered" + "base": "trading_station:block/powered_trading_station_powered" } } \ No newline at end of file diff --git a/src/main/resources/assets/trading_station/models/block/powered_trading_station_powered_lit.json b/src/main/resources/assets/trading_station/models/block/powered_trading_station_powered_lit.json new file mode 100644 index 0000000..a202656 --- /dev/null +++ b/src/main/resources/assets/trading_station/models/block/powered_trading_station_powered_lit.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench", + "parent": "trading_station:block/powered_trading_station", + "textures": { + "base": "trading_station:block/powered_trading_station_powered_lit" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/trading_station/models/block/trading_station.json b/src/main/resources/assets/trading_station/models/block/trading_station.json index 1efbcd8..e572cbb 100644 --- a/src/main/resources/assets/trading_station/models/block/trading_station.json +++ b/src/main/resources/assets/trading_station/models/block/trading_station.json @@ -3,31 +3,122 @@ "parent": "minecraft/block", "render_type": "minecraft:translucent", "textures": { - "3": "trading_station:block/trading_station" + "base": "trading_station:block/trading_station", + "particle": "trading_station:block/trading_station_back", + "back": "trading_station:block/trading_station_back" }, "elements": [ { - "from": [0, 0, 0], - "to": [16, 16, 17], + "name": "base", + "from": [1, 2, 2], + "to": [15, 14, 15], "faces": { - "north": {"uv": [0, 0, 8, 8], "texture": "#3"}, - "east": {"uv": [0, 8, 8, 16], "texture": "#3"}, - "south": {"uv": [0, 8, 8, 16], "texture": "#3"}, - "west": {"uv": [0, 8, 8, 16], "texture": "#3"}, - "up": {"uv": [8, 0, 16, 8], "texture": "#3"}, - "down": {"uv": [8, 8, 16, 16], "texture": "#3"} + "north": {"uv": [0, 1, 8, 7], "texture": "#base"}, + "east": {"uv": [0.5, 9, 7.5, 15], "texture": "#base"}, + "south": {"uv": [1, 2, 15, 14], "texture": "#back"}, + "west": {"uv": [0.5, 9, 7.5, 15], "texture": "#base"}, + "up": {"uv": [8, 0.5, 16, 8], "texture": "#base"}, + "down": {"uv": [8, 8, 16, 16], "texture": "#base"} } }, { + "name": "greenLamp", "from": [3, 16, 4], - "to": [13, 18, 13], + "to": [13, 18, 12], "faces": { - "north": {"uv": [9.5, 5, 14.5, 6], "texture": "#3"}, - "east": {"uv": [9.5, 5, 14.5, 6], "texture": "#3"}, - "south": {"uv": [9.5, 5, 14.5, 6], "texture": "#3"}, - "west": {"uv": [9.5, 5, 14.5, 6], "texture": "#3"}, - "up": {"uv": [9.5, 2, 14.5, 6], "texture": "#3"}, - "down": {"uv": [0, 0, 0, 0], "texture": "#3"} + "north": {"uv": [9.5, 5, 14.5, 6], "texture": "#base"}, + "east": {"uv": [9.5, 5, 14.5, 6], "texture": "#base"}, + "south": {"uv": [9.5, 5, 14.5, 6], "texture": "#base"}, + "west": {"uv": [9.5, 5, 14.5, 6], "texture": "#base"}, + "up": {"uv": [9.5, 2, 14.5, 6], "texture": "#base"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#base"} + } + }, + { + "name": "redLamp", + "from": [4, 3, 0], + "to": [12, 5, 2], + "faces": { + "north": {"uv": [2, 5.5, 6, 6.5], "texture": "#base"}, + "east": {"uv": [2, 5.5, 3, 6.5], "texture": "#base"}, + "south": {"uv": [2, 5.5, 6, 6.5], "texture": "#base"}, + "west": {"uv": [2, 5.5, 3, 6.5], "texture": "#base"}, + "up": {"uv": [2, 5.5, 6, 6.5], "texture": "#base"}, + "down": {"uv": [2, 5.5, 6, 6.5], "texture": "#base"} + } + }, + { + "name": "bottom", + "from": [0, 0, 0], + "to": [16, 2, 16], + "faces": { + "north": {"uv": [0, 7, 8, 8], "texture": "#base"}, + "east": {"uv": [0, 15, 8, 16], "texture": "#base"}, + "south": {"uv": [0, 15, 8, 16], "texture": "#base"}, + "west": {"uv": [0, 15, 8, 16], "texture": "#base"}, + "up": {"uv": [8, 8, 16, 16], "texture": "#base"}, + "down": {"uv": [8, 8, 16, 16], "texture": "#base"} + } + }, + { + "name": "top", + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 8, 1], "texture": "#base"}, + "east": {"uv": [0, 0, 8, 1], "texture": "#base"}, + "south": {"uv": [0, 0, 8, 1], "texture": "#base"}, + "west": {"uv": [0.5, 0, 8, 1], "texture": "#base"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#base"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#base"} + } + }, + { + "name": "frontFrame", + "from": [1, 2, 1], + "to": [4, 14, 2], + "faces": { + "north": {"uv": [6, 1, 8, 7], "texture": "#base"}, + "east": {"uv": [6, 1, 6.5, 7], "texture": "#base"}, + "west": {"uv": [7.5, 1, 8, 7], "texture": "#base"}, + "up": {"uv": [6, 1, 8, 7], "texture": "#base"}, + "down": {"uv": [0, 0, 3, 1], "texture": "#base"} + } + }, + { + "name": "frontFrame", + "from": [12, 2, 1], + "to": [15, 14, 2], + "faces": { + "north": {"uv": [0, 1, 2, 7], "texture": "#base"}, + "east": {"uv": [0, 1, 0.5, 7], "texture": "#base"}, + "west": {"uv": [1.5, 1, 2, 7], "texture": "#base"}, + "up": {"uv": [0, 0, 3, 1], "texture": "#base"}, + "down": {"uv": [0, 0, 3, 1], "texture": "#base"} + } + }, + { + "name": "frontFrame", + "from": [4, 11, 1], + "to": [12, 14, 2], + "faces": { + "north": {"uv": [2, 1, 6, 2.5], "texture": "#base"}, + "east": {"uv": [2, 1, 2.5, 2.5], "texture": "#base"}, + "west": {"uv": [2, 1, 2.5, 2.5], "texture": "#base"}, + "up": {"uv": [0, 0, 8, 1], "texture": "#base"}, + "down": {"uv": [2, 2, 6, 2.5], "texture": "#base"} + } + }, + { + "name": "frontFrame", + "from": [4, 2, 1], + "to": [12, 3, 2], + "faces": { + "north": {"uv": [2, 6.5, 6, 7], "texture": "#base"}, + "east": {"uv": [2, 6.5, 2.5, 7], "texture": "#base"}, + "west": {"uv": [2, 6.5, 2.5, 7], "texture": "#base"}, + "up": {"uv": [2, 6.5, 6, 7], "texture": "#base"}, + "down": {"uv": [0, 0, 8, 1], "texture": "#base"} } } ], diff --git a/src/main/resources/assets/trading_station/models/block/trading_station_lit.json b/src/main/resources/assets/trading_station/models/block/trading_station_lit.json new file mode 100644 index 0000000..86d08a9 --- /dev/null +++ b/src/main/resources/assets/trading_station/models/block/trading_station_lit.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench", + "parent": "trading_station:block/trading_station", + "textures": { + "base": "trading_station:block/trading_station_lit" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/trading_station/models/block/trading_station_powered.json b/src/main/resources/assets/trading_station/models/block/trading_station_powered.json index 5a94f22..4d9205c 100644 --- a/src/main/resources/assets/trading_station/models/block/trading_station_powered.json +++ b/src/main/resources/assets/trading_station/models/block/trading_station_powered.json @@ -2,6 +2,6 @@ "credit": "Made with Blockbench", "parent": "trading_station:block/trading_station", "textures": { - "3": "trading_station:block/trading_station_powered" + "base": "trading_station:block/trading_station_powered" } } \ No newline at end of file diff --git a/src/main/resources/assets/trading_station/models/block/trading_station_powered_lit.json b/src/main/resources/assets/trading_station/models/block/trading_station_powered_lit.json new file mode 100644 index 0000000..85ef66f --- /dev/null +++ b/src/main/resources/assets/trading_station/models/block/trading_station_powered_lit.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench", + "parent": "trading_station:block/trading_station", + "textures": { + "base": "trading_station:block/trading_station_powered_lit" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/trading_station/textures/block/powered_trading_station.png b/src/main/resources/assets/trading_station/textures/block/powered_trading_station.png index dd4dc0519755e01d7f8ca776e378322f8f8fd534..fefa8cb74e78d2319acec0dfa1a04e0b90867046 100644 GIT binary patch delta 825 zcmV-91IGNp3fu;eFn@V01pb%K|t%~MvwOi88c?g zXL#)BPw=Ps6Fg?T6de@6Xm2x798du^;tm02p6+ZbO@p_A`IA2jQp6euJ;~VYiO-;cXx;Bbegn( zHk)BSp927TlgVUP6a|*cWfJ`y3GZP5Wm)3qzd;HJbMBj_W;h4y`BIBAejMRe{2l^DM=XX z$ayjY*k8#O1B^^5)u;)Fz_HFt86YB5RfR!p@YDVM_kZ8RA>MB`=o;zr^0U zwYGJfUEi{-_g?!NvM%rCxp2+o zV`Pj8`* zYZT)#s?DacE|ZRrgV#AH;-i%ewg9m6*pbPy)_+>eg!eu$CvzZ5`-<<%8@%TCEvMj8fI{)|)lHiyj9{DBo-s6n>0ggf`1?u;aWf`d74?pQdYmK5P z8ZuAw&CN~da`=tlAJ3Vg+uPeO4G2EhuDFnJ`p5P>P(&DrQwV{woWKq&) z0r>!IkdTmAu<43*h19S>Vo?cJU6g&l0p)8zRZtdm{T z0)V09`t*XNO)G5muQjynpPkoHYmS#~B1|3E3y%c{GQD(jL&;H`90eef5t^lCx{-{s zzGi6{hD8ua8ciR^3sIw~dCrt35N4iHA!xcTuIKlSd)vxh6=CMdc|N;4RZ8Ap*rR!T zKjzZ;Nu+=10DpGB=L}tA^>2p@Q$=>F4OA&5yF0KhC6;An%DcySAk~#pqU$R5sL7Y# z+~LPtHvx!~{;N=xcHemU?tLEIyN#x)DDw-8$-=dH9zI&ZbG;MY4`2$Dbj_UDrBpQe z z=^DLVr|CxoLCl&FY@Gyd7u!s3i*nSCX~-CL{LBQFWnqajo6ojRKD}izbFqwcJ)|@# z7h(!R@VM@sc=EIbC|U+hFGM}9+k2%0F7aHCmQYZX&irY>?P43&LDyB(utn~8sFNj% zS~yLQIDa`Eceh{Oae`hvKY7B^+9RCmATnB!UvT3g~h}=NG*BF zx{&HhDVfz@Qkp36>DPBy`S}L`!dO996T(=@*63=I_2)nTmIwE4BmEfVy}9|s6eg(= zN6F^1EoLs3f&OB2t<P6h)z6sni+)`-+8@(BT6|fgc8X_rlD;96+nx;eP{p zqvPJjLDU<%mc4{t5K*)RjvEq2ErbTL^@@Dp>H6kS#+34bAdILvF47M%bd8$hQm|AE zU886Vf-pi+6s)|CX{f{b0Km+}GL^mR0NAi=fi54Ae#rRPD0w}P=eIBoEz1U7O)zvV zGcK3Q9nA*-o~*8AL6^#~Yk@8w*ne?g$LSWbPT+N}pf3=2T>$ou;sYsI8g!`)1BWgj zC{Gppay?0s9xW?-6VkY7`5iuxOZk8$OoXry!lJTQWomMQ%3d}5(tkp9-iw86^O(XU zj3RVR<)bfdIS)TQtS~~Yiqtr-{0zx V?d-+gssVH(gQu&X%Q~loCIBiBR&oFU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/trading_station/textures/block/powered_trading_station_lit.png b/src/main/resources/assets/trading_station/textures/block/powered_trading_station_lit.png new file mode 100644 index 0000000000000000000000000000000000000000..a6895a49f2cb5f51eff0fbb3ac398f3215af2db3 GIT binary patch literal 916 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 diff --git a/src/main/resources/assets/trading_station/textures/block/powered_trading_station_powered_lit.png b/src/main/resources/assets/trading_station/textures/block/powered_trading_station_powered_lit.png new file mode 100644 index 0000000000000000000000000000000000000000..6e181930321e2b5fd1e055b69a7f4c67ec5a7821 GIT binary patch literal 967 zcmV;&133JNP)Px&fk{L`R9J=WSHDjbK@|QL4jdwq!M)%nQcPve?m8~H5(^4rs4PrKsEDg{t}BE8iXIsSY97*Q0R)BxpMYn>~4rIf1`VqkCAoD0fVvI78pRE@@%T=WBQ;5=oq zk6hq8e&`$!LZB}<>IDt~xD*2vK$in~iZH3e-}5pM`)3Rkk^pfS!aF>~JpkC=#s~oK zbpHkb|FrOU^ioQA;pG^h2H4}k^Uck--vFO{$;-g4@o>x) zeu2Jetu+p|w^Kp+IvmH4QbH+(X0r+4gwCa>i>S>lOpId;0C3koT`>kP1ZaO8V_15& zh&X^TkB#W89m9=)D-IVI;^!PMM$0zjcKB_cApu)jDjF==V&#? zxCqH1sxNXTvlDVaF7xg7hnK*^XUm9%aLE7w002ovPDHLkV1l#^z3>14 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/trading_station/textures/block/trading_station.png b/src/main/resources/assets/trading_station/textures/block/trading_station.png index 68984c87fd28bd20cd3812671bd7409a30807b0e..ad615f0f0ba6e627cdfdccd0a0a7bc49046bb637 100644 GIT binary patch delta 1322 zcmV+_1=af52FVJLFnB+n!VN3e#DsBS;(|n1EO5^^5I=xx5<`g2LLw4kmByluyEl?D(BX%bL)TZx#!&TS3bK?%MOoK5T?%9XayOhgnx0!USgGXTt8xEwNBj) z7|}-nFqBfCU6i$H#jXCehE{yD%Q|Y^4T_%#Q^ybDJ;8y(F8{fqlyD|003CnZqZylrQOGb3v`hWh((>1(?OPVB19h(9LyoS5$ zIFJGP8ok}1874$g%0nYs*$>=y+Dxp9TGCGOWQsa=cpS^JutbgJ$1D5q-m*A;vWD~n zq%^5jQ>sGnXCv5m=eY)OEQ4kcqaHNuz0v`f1b#qEC@4y2{vhDC(}qRRbrm&kQQ8}7 ze@T)SZhtc%%?<{hM<9w*qB!YyAdqrjz@0X6lG03GE&{63rfg^ktBkr6z-xG9tpvL& zaJRMqu&V;E;SF`D?grSSo$<>=;Mtak+Xx07nEvDLqd?OzlZ0WqQ9E_I*Sx7|{`oLtA3^-z{{D=6!gZmF*c&QJH2WMucUke{l zX6G(t)^=&h1NMd7R!YgV{*1}-DxZFRorRx&03c2kbTuPRm12#qX2p2+^KZF*^BOWt zQQn@J%}imEJF%NAKVISZ$r{k#jLuIsnSXRlGL$}htE?B}JSzEI+0a?r^l18W@Fwg9 z?3GWBPw{Jy6S+Lwa&d!@iSeo2%`?hJR_X5V~mqC!;&Y@q?8+qzr#aViL-7)4R2S}JufVoR~mGCF)m~WX9k)4@G39(9iWBOtj|^iB zU8C;$R4o-l*Klk>6elQ(f>qWr4Rtsl062cK#zLz-05ZQFS9$lBG{u~)&Kwi07*qoM6N<$f)sa)UH||9 delta 822 zcmV-61Ihf!3fTsbFn1&Z4E~%PP%RB)z(5tiK(!RTA;XO~-k1l- zkTH+pv7;ZskCI2YAw!BT*G&P8R$GYT1`S5sA*Iawv8^;2I+TE+JDVauexxXRQkLab zYYn9owAKhAAcTNJqLe}i0p5EM5tLGUb^ErYu2Kpa5k(_x_Bv7tWlL&CZt1Zb_HwZ_fO4Hk<< z(*EUgiPdTa0GJd-u`SCIbzLXX&ynyR2GBGOeiq;BUymm^n?B*t`uX8gnddo(2&YP^ zFYEOhZQEkA*?(X*n*jjYw%z+2LICe!MnVYq@$PYb%=y{$3Ge-EzS(Thw(WBbaK4>$ zNzq$tW34a)M07NAUeB?sn~Z5Eq9poRckH;PI6s>{0S`L>C&^xq00NNA0I*A22S7>@ z_I2cYG6UEh$pHh5Oexjr3H!jY&Py2}B6#nS^$mXg@PF-~foc7*qt8u@h+bR+T5Du{ zrk!(1m3;nZqqP=wT}L{X%Ow_zMTrOC9KfNq(}=9KTQ)M5zEG;a3$1Kc*d}pTkc@#iZRk7$K1N%fq zIR*~EpdR=lJDtzxU&^wK=(8+C+qN*qzIEbDwOE-vD~q%6yDeSM9)yE_n3 z953-X&+_OgrEqn1h5P$^03-82s{Ee^-fABB4ZPBA5sVtb6aWAK07*qoM6N<$f*B8n A@c;k- diff --git a/src/main/resources/assets/trading_station/textures/block/trading_station_back.png b/src/main/resources/assets/trading_station/textures/block/trading_station_back.png new file mode 100644 index 0000000000000000000000000000000000000000..75c28504d91cb025ccb3ad151fa4b02838399f22 GIT binary patch literal 286 zcmV+(0pb3MP)Px#*hxe|R5*?8ld(zzK@>$#%&>800zyJ!6D2l_s6`M-e#7q;3mZW!1kobw5*9Yh zdvP_!VnJ*YM@W&vTiY;`S5D@W$)3z!arYlu9#c z;%!3EY9kDM_mPx)KuJVFR9J=WmOG3aRTPH5vFG8LYkT9hv%3l2kVs((EJ9m^L=gfiDkL64LTN&W zgs6~GL_r`?M53ZWh=K}{L1U+o9WT{GQ!lEpDQE%K0y?4kXR)h+Y4!JcInzaMZE}sp%ljK z!gN3qCF5%iE&o<6>8M@X&o>dKj^{@Qf&;l-wz;7cs5Qy}#4<*+wA?n9ajt8YhGAHQ zp~P_mY(GMc7uPttP)C?0%0l3J9-beJy^oGtyKRJ7qTmPYY`0nPf1_G15d?ispJ*V1 zeFvzHN6yeSZr-+ee6hxM+d-95va=0$rNpwV+<51J2xPWWN_1VNS~hv{@_T%J`9r!- zBn(nz7@2MXcR8WJfJ&>FuYc|8``r2b8#GNtSvz+jJ$H7E>o?Z%J^#?~1DL`jTeB*5 zSg4u&6mD?)s{)O7o!xr-!13f89iDmOIIbrt>bmvuUw?1m^lbWZ%+m2CP{8Tg57m9? zldaJQJ=`Eh*-VIDJsfa1ZOl_9vq_k0qepeW!p6B_NsnVe_>4Ozl2h7=A( zJ4E6*!FGL$z2eLfC~p+mu>!&<9(TZ(@=(D2Hc{NijUk>(X9C}?w<#(E7JL(7l~DHs zI6a3niK$iucBcbCwIXnO&QyoGwoi2q${R&mGe!V*xz};9d;X*YE5Ba9?Q0rl95Zd~ zHBX%$wQnxf5T=Ixr$2K97J-^5QA|P2YWk168<>_g6?AkoEelJSJoEGl*Ke#7#a(Ju zlS`joQeUD1DU+dQ^Vp|xqFJZd+zgD7uCStBxx zy(>Ko<-~g|V_X>$rUR6ho~oz7BXz@~UYy#Bf!t=a4QHaMI%=(I@~C_u+j!IoLn(}b z$uOR9#8mkY@qt@6e~0O%J}C~ISzY;8_<*u@?m}ukC@nc-U&w5wl&t9YSg2Qc<=tzn zfBOjlQC~qs*Vo>>%6Fe#K?Z%4Cs)@}QW^a}BT+gDC&6NzDt+s>f$;q2=6mV2tUS8tI5hpUa*RiqvfJS{jFS#(3VDIT! z8TP`VBVl+S*9(c`bh-l@cUoM0_RQE^yL+FD&z|9D+Z~&4Hp*0lpei(A?!mZM_fcOE zgb|9OP_b0HPDn?w&{A;yXwrcUd_U0hwIdUA0Lfs;2TH~;yv~EHH*}3K8tQ%+Q>zMW zFCvN)ga$HEQKMvbKJc^cPGw9P9|)tEuI(X%2t(KC+8z~4#n3fsRY4fVD2jqr(lHH{ zFzQe80f6O`P1cja1lY9S0(*Qw1`+dfWlDMpKS(eQEw2V$O)+#Wcdk$>~(KVIl-nxSA z#cZ}cHrpPK?B~x`N7A)D!YIbjHD0*%5hX)I*VIWqFsmHI2QtY{3;fRq9?A#)0ZX>X UWZ!VB^8f$<07*qoM6N<$f&s3aEC2ui literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/trading_station/textures/block/trading_station_powered.png b/src/main/resources/assets/trading_station/textures/block/trading_station_powered.png index 68baca7feb668c888fb472f9e9c5a8d92a44f804..77e4361d2e6567790621def32c4deab6727d2583 100644 GIT binary patch delta 1468 zcmV;t1w;Dh2igmeFnfcY7W^JCnm`W_L)6q#z%1NL{MCr+U8X>aMC!`Pnng?0?W$1IN-C8*LzhgfI@- zOKele??tTKZPD@r>UtdjL#b8lqAaB!_p5sit^DSiI%>-g%AYuvPA`b}1P4mH;^&4^ z!<%RTAcaJ;wbE7!S&lVZ!!T^3NYLqq_(6;+56^LEavaApX*dquUXNZ7R_4Qcbz>99 zGN}b2>uZ}#27mv-ZJ2~%!jnfP5aG51xYfuRy2fW;`F#Jd$J%BGRS3cQ8r%{B+qO&N z^*tg`*a{)gbrrW^@$=W-;+*ynLGPjcJ|C1A78yj z&r8qUpL}tfYfo?e-EY-!y_CK5xqqd{o;~%0$LaP2bzQgL`1bZH zowiRRB~y=2fdZYj|G;q|0*XC)+NK*yq9|d}h*tIkcfFK}yG~Q42_2E3jvX4uwry;u z$@0yW{ZDV(%p7eZdI3UMG)EFf9EX3mgMCk4XaLVP=ms(BLBl>QIk+I`1@s*SMakC> z0`7V#+O2ytb2X(WEO0i}dI;)!n($`lm zrRjyn6Gtj`ceZ@|AY@{EtW3Em65tQUMH;rF+>t1{N4FOtWwyHm%Qshe`|Ilq!+&e3 zs!qRlV{zgACyrE0@kE0W$H8?pVD!Eo!)5 zUhntmXc{9@^3q@bvhauJFU)VZ@25E*FpWICo%^re(6zD>29d;b9sFKQEc-Ybi2go& zAga|^H%-ENopsaX{U85i{>$Y%JAdp7J`lx{mfu5!F@~Q1F2@AJ+Teg&0>xZVR`V}Cb30N_f= zD>oJwQdONEKJmi2^Ygx@Z8tCZK=ZIy$@Ofgn}S`|gyLQF!<-M)XJ%*LID2M}t`Inm zO=gXlNkLG{PSO2_%OwuYJco_LVANa2Lz<&XR WPvk;}3K1Lt0000fP96#mxUJCBbOjAF}~JAyRj3R1XSiDtze zQV?y5lqnI_HCzQ!q-!XVXu=PmrH+K|IwTh<(g3TIkOnD&mE{cs+MK6IycFgQZ`W&Q z;jW;4N+}_PfRqx>IXLIANrVt^&VM1xGFWRNgjlOv-;3)C zArM+?{U)^WO+tEHS4!y(awA-a+n^_uQbH-^8L-y+O=!-?EXyhkaIch78yz43#uzB2 zV68<+8`Y6-64G_fK}rcJCDbQx;^~ubz0UP$QCZWSc7VUIeQ@+4o`3!$03aBT$7LMH zm`o?sj==}T~MN#1D z>I%c*5CBjV#oBl09B2(OGVjjOd)R+=lkwRg$DQxQyXDUd6h*Pj0gAUVrj_?vYo9B` zK%QT0G|ESy^x+PPc57`b`boFxxVAAq8|2u=mIu&jZGZI!Kmh&$1Mm)10JKTMx(=VW zWuQCl_#+we%@(5)#obH1cx#RhLQF9O0Nl!Mqv%}%cY&*W3*fh^_fksWR(l4nM+?~J z%K}&d0019-{W0c!hyGkNj$c0fq7pbNV)^AoTL#{^KOOqS59v%BV~}57Y&71V3-o$D z$k!ya)_<5xCIFTv+`=ua<8ng)A=>Poj>}O*ej)cS=Cyv%@6+0%X;v#w;}1$T1qZ%xIX7Lf+&hS z1ON6mY;zs2(+R1Py-YvQMw)>9xB7uJOL z;^gF{!b079lD)k>93LOUIk!wgLPj(;i800>GkzH|c z5=9ZxG+jCC9xZh3tnVEibq0MJ?^%d!pUX`1?^BWVf?N!>6BF~R4=6umbBNRq@S9cN&ja4(y{0a(cgy2!daJ3B{l z9DDR(7@{Z&D5a2P8H%DFbr{UaDda(Q&?+#i%)UpM^6ZW{r!EM not*(_=m*-$|NX$L>IeP=0BCd^r*DxW00000NkvXXu0mjf=*P!= diff --git a/src/main/resources/assets/trading_station/textures/block/trading_station_powered_lit.png b/src/main/resources/assets/trading_station/textures/block/trading_station_powered_lit.png new file mode 100644 index 0000000000000000000000000000000000000000..408c80e1e14c236848dbb41f33e2fa371e6b2b8b GIT binary patch literal 1559 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 +15+7e`H3o$XLKmgFw@Q3i_WIrfG&H z!;LU+ipbO?6KQguAjl(8#)L?OSGF{4V-2~7h8eE2Nc_Iw^RSPh9}_<)GM4YQXzY1S z+lZ5sU3AQ}y=D1Khc4Y$y#{fnNqoC6PWmNg>d^m_>}?}-up*o6(BC5T9&BWRjZPr_ zb)~>=UV_rfR7$*kGTO_y&+D7jmqFtf8ov&mWSibn7cEP!*Exh$iASak50zK~!h)ud zJV&Iu0A)PU#{Jj5Wi93kSy<}5Ry7JuG%C$OU-^p9hGV$VN6Jd`vCX^XAQmNC)3p28 zCZv8*1$KKKlU04E&X{9Dg(EGDV9$H!>1dRl$%z9s&4&~B?VAVSD}t&{mPTtws^ptj zM=sL4%HLkQX`TISb@d19*EhZ|5AWIc?jtXq5LZsT-56V(zlJ_7elos1^yJXN$4*QQ zU%Ke(J|Nza9Q=$Cn@Ouz&ez*H6*cz+`!t63#wQ6bmfykGCbT0H?zaMh<>tW9~w?2Nj?_Kim!{qq7 zzsal04jlaV@ALhYvp;mI^0S{?mdBuT_v+QFS9~pQ{X8Ad^!ciZZ*gU%<*(cyReRU1 z+I?>S%^b0xxA(uw6M9<5cR-*)^~c-qyA=;yzyB}5^rB0`_0qeStm~&LGRQm?v8tcS z(6D%p)ARL03<0<3NskMoVT`uFW%nX&MumHd)vJ| zm6yGn8$Rx-P>Hy`O<(M0j@dPV15C0eEE%(&{ad{1)#Ky+-`6vrPUT~0k}c8t@c67# zdV0G5K0cjpYh*Kd#TZs!J$0WW@fjO;!|mJA^-2vhjaguJmtF8Wuuo>!?t=Nx%jEbX zts7rY&%DBrF>BeaZF}RL?wI(N#+L72neqKs-sX#WCqEuuAHDv%|2rF*O=V2i^)Ihr z{7~`!z`M`Sze(AA|9@;)BS?w(N|xKbFXspy2)L&l6x!`9Ok7Oq9Xd z&tm48UqG}Hk@VA~1?iBBSrcFr%jbKGmM;@Q8yK5lVkb=dT_%=))LLZw?Q zXGPYrHxq8Z{bt9q?e^P@_op+38R9eEoYP==F~MYJ&7D-cf3d#45a z=7|*-7ccI!a=-p@%fg3yc8KiAy{%u>d^RoE+}!-tisBMk?kjD{9N?6KZU8i3uo(U3 zs54uO!ajs7|lhv4TQ?f;aGC+ z&1(Z0b*7cZzpeaOr22##ugt8KRcGQoE`#Yq{N_On;Yokr>0sdQ$MULQ5oW@My^|aK zSi{o!O6BHr`P9$hS_8Co#vHjmxC&_AAs8adnN|ZG%5!|>0iC|!#^3OO)H(I;+x)sY z;h~pJe9Nn=Uq5o1aaY!1bJSY3T#gz(;fB8zHH^DGqZsG=KW7IPUUUNs)c-Te9Md$~ SP-bolveeVn&t;ucLK6VteGYj5 diff --git a/src/main/resources/assets/trading_station/textures/gui/trading_station.png b/src/main/resources/assets/trading_station/textures/gui/trading_station.png index 03c47a80cfa1fa748195cfd373dbbf5c8dc0112a..60b7791ab077b5edae57a7a7090660bf4593a724 100644 GIT binary patch literal 1505 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G!U;i$lZxy-8q?;3=FKZJzX3_ zD(1YsyFX7RRN~mf_ZHRuvn{4Ow6{&0)Wqf*7vCzJdtSG~m32!=p^Ia`i#O|)3o7l0 zqSOly{4cw{dGq_v9uw!BkeRPCCqC`i>+@^xy=J|9@z|dSd%xd{k}l=Hz2P74mw(UA z7w56Odv$#Nzjf#L{n(augyYM->d>oKlnX-m?1jG^{uv%R{ds}N>)M(h-$c&Z{W*Dl z{~x<+b`Q?|`}KJK#_b;_YToCQ>D|jXV^{e4xZb_3?6dFw)7!8=D*Nrz)6@IwB>myCbT+SA)wzGpOapOo@zBuHni`u= ze#_45GO+x9vGl;}O^58F^`PX`3d3(=77k1Xf~TJbvE0~o^M>?{O~-8}oPPRA ziwQ_vw9{+%Wib14qdk!2hT3)p;V;k5&fd8FKw|;xhQ{MI9bgZAeRFg3>g|caOh6&K z4nF(a&%_dxWa`Qs8PpCvOc%%Q9rJxc1=8_v&3K&GhH1Z!cz*D;P5r-`$E82=x9=0F zkZ9|*JCL+-#nr4-+1EA|vieQ8WVe$R8oLYS4jAxkjnFasr*Lf}-|v;7q3`#GUtNB` z_Lz&p>oHo#W^v`rt&Mp8Ddkavi ztsO9@uy@ARO0BhlSnLEjsQg)yO|swTsSXV1-JA^hoJ}VCOH==73+AI4^Tpe?ZJVYU zbsPH7{R7(e_isks5O}K}e*Ck(IQzD0#0a!)+g4T0Jpu>i;D2X^zQ6jaYI7WpqT7zA zf1abGr(b;f>DRHg1K#Y9-~JkV6FxKN(}9DrHvs1D^73-*P1xGe>pue1)ih0WadENp zx8cj>vZ^)*|7x|G<^TRwn~Nxq*8rRXFb6;XvN;9#^6T%aM!FE#wrxB2gTKlt0BmI+ z4*n_ufUWGq!9iao01!<8AeaC^FadyIP5BTI^R^ckFG{q zvtb`+>Ma0G)6`Ma1zA1=~;{rvmgFV6q{yGlxdt$hIUW4u5&#G$01!+7 zAlPJo0x;yoBp0fNXCKegWC8%}o&Z3w$poOg;bd;JccqUz^@g+$`#8~L0>I1G>-FR# z!2I-fCt#vo9+2zx`Y{6Q^?GNo%YGAp58Cy?C<64!DZmWf-QA773G4~)06t)s2V(ar zyW`_ypSYtpy?z?->BmR=H011$*!6)pqVZ1!9X{Xf5b zoT;g*w!4kfTTAAky8wE1byc=8W00<@k5bVVpf%|i^bwYFR)sz>iYWH9CNmw;|8_iI0b-U0sz4T0D=hs1QP(0 z4g(sK4+91(*o*4{EEbDio)%+{IZV@wPX@9gkU3MB^L#}hPX_9b6@ko|{2VI+4aYT; ze*rEXSrN#b$RG#o1enKSu0Rss{)%d`8h65563B!zylbQzXKLUtO{(- z