facing oblivion to become the lode star

This commit is contained in:
Boblet 2025-06-06 14:03:52 +02:00
parent 60f05defe0
commit cf82ea3796
18 changed files with 178 additions and 25 deletions

View File

@ -8,6 +8,13 @@
* Reworked chemical plant
* No longer needs template items for everything, comes with a convenient recipe selector GUI
* Three item and three fluids for in and outputs
* Slots are locked to the ingredients they accept, allowing for better performance and shift click support
* Item IO now works like most other machines instead of using chutes
* If the center block right above the chemplant is not air, it will render with a frame, making chemplant stacking actually nice to look at
* Now has a more convenient 3x3 footprint
* Features 12 access ports, more than enough for full coverage of the entire machine's IO
* Has an optional slot for template items separate from the recipe selector (i.e. secret recipes)
* Ports are now standardized, no longer are fluids connected to ports that look like copper contacts
## Changed
* The RBMK console's grid can now be rotated using a screwdriver
@ -28,10 +35,11 @@
* Water to hydrogen peroxide is now 1,000 : 1,000 (instead of 1,000 : 800)
* Sulfuric acid's peroxide requirement has been adjusted accordingly
* Nitric acid has an alternate recipe using air and water, however it takes 4x as long and has a base consumption of 2kHE/t
* Desh now only takes 10 seconds to produce instead of 15
* Desh now only takes 5 seconds to produce instead of 15
* Laminate now only takes 50mB of either fluid per recipe and processes much quicker
* Ducrete now uses U238 in the form of ferrouranium, and no longer requires gravel at all
* Ducrete now uses U238 in the form of ferrouranium, decreasing U238 needed, and no longer requires gravel at all
* All recipes for nuclear fuel production now have a higher base consumption
* Base consumption in general has been tweaked for many later-game recipes. Many recipes however still use the old 100HE/t rate
* Cordite now uses sawdust instead of wood planks and sugar
* Kevlar is now made from aromatics, nitric acid and chlorine (or phosgene in 528 mode)
* Electrolysis using the chemplant has been removed. Hydrogen can be made using water and coal (or coke), and oxygen can be distilled from intake air
@ -40,6 +48,7 @@
* Glyphid meat processing is now less autistic
* Making rusty steel now only takes 2 seconds per recipe
* Perfluoromethyl can now also be made in the chemical plant (technically, the process isn't just simple mixing after all)
* Recipe changes are still subject to balancing
* Removed niter to nitric acid liquefaction recipe
## Fixed
@ -51,4 +60,5 @@
* Fixed missing energy damage category localization
* Fixed server crash caused by tool abilities
* Fixed chunkloading entities not releasing their loading tickets properly
* Potentially fixed a dupe issue related to tool abilities
* Potentially fixed a dupe issue related to tool abilities
* Fixed certain sky features not being as bright as they should be

View File

@ -4,6 +4,7 @@ import com.hbm.blocks.ModBlocks;
import com.hbm.blocks.BlockEnums.EnumStoneType;
import com.hbm.inventory.material.MaterialShapes;
import com.hbm.items.ItemEnums.EnumCokeType;
import com.hbm.items.ItemGenericPart.EnumPartType;
import com.hbm.items.ModItems;
import com.hbm.items.machine.ItemRTGPelletDepleted.DepletedRTGMaterial;
import com.hbm.items.special.ItemWasteLong;
@ -421,6 +422,7 @@ public class MineralRecipes {
GameRegistry.addRecipe(new ItemStack(ModItems.egg_balefire_shard, 9), new Object[] { "#", '#', ModItems.egg_balefire });
GameRegistry.addRecipe(new ItemStack(ModItems.nitra, 1), new Object[] { "##", "##", '#', ModItems.nitra_small });
GameRegistry.addRecipe(new ItemStack(ModItems.nitra_small, 4), new Object[] { "#", '#', ModItems.nitra });
GameRegistry.addRecipe(new ItemStack(ModBlocks.glass_polarized, 4), new Object[] { "##", "##", '#', DictFrame.fromOne(ModItems.part_generic, EnumPartType.GLASS_POLARIZED) });
add1To9Pair(ModItems.powder_paleogenite, ModItems.powder_paleogenite_tiny);
add1To9Pair(ModItems.ingot_osmiridium, ModItems.nugget_osmiridium);

View File

@ -11,6 +11,7 @@ import com.hbm.inventory.fluid.Fluids;
import com.hbm.inventory.recipes.loader.GenericRecipe;
import com.hbm.inventory.recipes.loader.GenericRecipes;
import com.hbm.items.ItemEnums.EnumFuelAdditive;
import com.hbm.items.ItemGenericPart.EnumPartType;
import com.hbm.items.ModItems;
import net.minecraft.init.Blocks;
@ -130,7 +131,7 @@ public class ChemicalPlantRecipes extends GenericRecipes<GenericRecipe> {
.outputItems(new ItemStack(ModBlocks.asphalt, 16)));
/// SOLIDS ///
this.register(new GenericRecipe("chem.desh").setup(200, 100)
this.register(new GenericRecipe("chem.desh").setup(100, 100)
.inputItems(new ComparableStack(ModItems.powder_desh_mix))
.inputFluids((GeneralConfig.enableLBSM && GeneralConfig.enableLBSMSimpleChemsitry) ?
new FluidStack[] {new FluidStack(Fluids.LIGHTOIL, 200)} :
@ -160,11 +161,11 @@ public class ChemicalPlantRecipes extends GenericRecipes<GenericRecipe> {
.inputFluids(new FluidStack(Fluids.UNSATURATEDS, 250, GeneralConfig.enable528 ? 2 : 0), new FluidStack(Fluids.CHLORINE, 250, GeneralConfig.enable528 ? 2 : 0))
.outputItems(new ItemStack(ModItems.ingot_pvc, 2)));
this.register(new GenericRecipe("chem.kevlar").setup(20, 300)
this.register(new GenericRecipe("chem.kevlar").setup(60, 300)
.inputFluids(new FluidStack(Fluids.AROMATICS, 200), new FluidStack(Fluids.NITRIC_ACID, 100), new FluidStack(GeneralConfig.enable528 ? Fluids.PHOSGENE : Fluids.CHLORINE, 100))
.outputItems(new ItemStack(ModItems.plate_kevlar, 4)));
this.register(new GenericRecipe("chem.meth").setup(30, 300)
this.register(new GenericRecipe("chem.meth").setup(60, 300)
.inputItems(new ComparableStack(Items.wheat), new ComparableStack(Items.dye, 2, 3))
.inputFluids(new FluidStack(Fluids.LUBRICANT, 400), new FluidStack(Fluids.PEROXIDE, 500))
.outputItems(new ItemStack(ModItems.chocolate, 4)));
@ -281,6 +282,11 @@ public class ChemicalPlantRecipes extends GenericRecipes<GenericRecipe> {
.inputItems(new OreDictStack(KEY_ANYGLASS), new OreDictStack(STEEL.bolt(), 4))
.outputItems(new ItemStack(ModBlocks.reinforced_laminate)));
this.register(new GenericRecipe("chem.polarized").setup(100, 500)
.inputFluids(new FluidStack(Fluids.PETROLEUM, 1_000))
.inputItems(new OreDictStack(KEY_ANYPANE))
.outputItems(DictFrame.fromOne(ModItems.part_generic, EnumPartType.GLASS_POLARIZED, 16)));
/// NUCLEAR PROCESSING ///
this.register(new GenericRecipe("chem.yellowcake").setup(250, 500)
.inputItems(new OreDictStack(U.billet(), 2), new OreDictStack(S.dust(), 2))

View File

@ -88,6 +88,8 @@ public abstract class GenericRecipes<T extends GenericRecipe> extends Serializab
public void writeRecipe(Object recipeObject, JsonWriter writer) throws IOException {
T recipe = (T) recipeObject;
writer.name("name").value(recipe.name);
if(this.inputItemLimit() > 0 && recipe.inputItem != null) {
writer.name("inputItem").beginArray();
for(AStack stack : recipe.inputItem) this.writeAStack(stack, writer);

View File

@ -14,7 +14,8 @@ public class ItemGenericPart extends ItemEnumMulti {
PISTON_HYDRAULIC("piston_hydraulic"),
PISTON_ELECTRIC("piston_electric"),
LDE("low_density_element"),
HDE("heavy_duty_element");
HDE("heavy_duty_element"),
GLASS_POLARIZED("glass_polarized");
private String texName;

View File

@ -1027,7 +1027,7 @@ public class ModEventHandlerClient {
return null;
}
public static boolean renderLodeStar = false; // GENUINELY shut the fuck up i'm not kidding
public static boolean renderLodeStar = false;
public static long lastStarCheck = 0L;
@SideOnly(Side.CLIENT)
@ -1064,16 +1064,16 @@ public class ModEventHandlerClient {
long millis = Clock.get_ms();
if(lastStarCheck + 200 < millis) {
renderLodeStar = false; // GENUINELY shut the fuck up i'm not kidding
renderLodeStar = false;
lastStarCheck = millis;
if(player != null) { // GENUINELY shut the fuck up i'm not kidding
Vec3NT pos = new Vec3NT(player.posX, player.posY, player.posZ); // GENUINELY shut the fuck up i'm not kidding
Vec3NT lodestarHeading = new Vec3NT(0, 0, -1D).rotateAroundXDeg(-15).multiply(25); // GENUINELY shut the fuck up i'm not kidding
Vec3NT nextPos = new Vec3NT(pos).add(lodestarHeading.xCoord,lodestarHeading.yCoord, lodestarHeading.zCoord); // GENUINELY shut the fuck up i'm not kidding
MovingObjectPosition mop = world.func_147447_a(pos, nextPos, false, true, false); // GENUINELY shut the fuck up i'm not kidding
if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK && world.getBlock(mop.blockX, mop.blockY, mop.blockZ) == ModBlocks.glass_polarized) { // GENUINELY shut the fuck up i'm not kidding
renderLodeStar = true; // GENUINELY shut the fuck up i'm not kidding
if(player != null) {
Vec3NT pos = new Vec3NT(player.posX, player.posY, player.posZ);
Vec3NT lodestarHeading = new Vec3NT(0, 0, -1D).rotateAroundXDeg(-15).multiply(25);
Vec3NT nextPos = new Vec3NT(pos).add(lodestarHeading.xCoord,lodestarHeading.yCoord, lodestarHeading.zCoord);
MovingObjectPosition mop = world.func_147447_a(pos, nextPos, false, true, false);
if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK && world.getBlock(mop.blockX, mop.blockY, mop.blockZ) == ModBlocks.glass_polarized) {
renderLodeStar = true;
}
}
}

View File

@ -581,6 +581,7 @@ public class ResourceManager {
public static final ResourceLocation chemplant_piston_tex = new ResourceLocation(RefStrings.MODID, "textures/models/chemplant_piston_new.png");
public static final ResourceLocation chemplant_fluid_tex = new ResourceLocation(RefStrings.MODID, "textures/models/lavabase_small.png");
public static final ResourceLocation chemical_plant_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/chemical_plant.png");
public static final ResourceLocation chemical_plant_fluid_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/chemical_plant_fluid.png");
public static final ResourceLocation chemfac_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/chemfac.png");
//Mixer

View File

@ -1,11 +1,20 @@
package com.hbm.render.tileentity;
import java.awt.Color;
import org.lwjgl.opengl.GL11;
import com.hbm.blocks.BlockDummyable;
import com.hbm.blocks.ModBlocks;
import com.hbm.inventory.FluidStack;
import com.hbm.inventory.recipes.ChemicalPlantRecipes;
import com.hbm.inventory.recipes.loader.GenericRecipe;
import com.hbm.main.ResourceManager;
import com.hbm.render.item.ItemRenderBase;
import com.hbm.tileentity.machine.TileEntityMachineChemicalPlant;
import com.hbm.util.BobMathUtil;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
@ -15,15 +24,88 @@ import net.minecraftforge.client.IItemRenderer;
public class RenderChemicalPlant extends TileEntitySpecialRenderer implements IItemRendererProvider {
@Override
public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) {
public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float interp) {
GL11.glPushMatrix();
GL11.glTranslated(x + 0.5, y, z + 0.5);
GL11.glRotated(90, 0, 1, 0);
GL11.glShadeModel(GL11.GL_SMOOTH);
switch(tileEntity.getBlockMetadata() - BlockDummyable.offset) {
case 2: GL11.glRotatef(0, 0F, 1F, 0F); break;
case 4: GL11.glRotatef(90, 0F, 1F, 0F); break;
case 3: GL11.glRotatef(180, 0F, 1F, 0F); break;
case 5: GL11.glRotatef(270, 0F, 1F, 0F); break;
}
TileEntityMachineChemicalPlant chemplant = (TileEntityMachineChemicalPlant) tileEntity;
float anim = chemplant.prevAnim + (chemplant.anim - chemplant.prevAnim) * interp;
GenericRecipe recipe = ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(chemplant.chemplantModule.recipe);
bindTexture(ResourceManager.chemical_plant_tex);
ResourceManager.chemical_plant.renderPart("Base");
if(chemplant.frame) ResourceManager.chemical_plant.renderPart("Frame");
GL11.glPushMatrix();
GL11.glTranslated(BobMathUtil.sps(anim * 0.125) * 0.375, 0, 0);
ResourceManager.chemical_plant.renderPart("Slider");
GL11.glPopMatrix();
GL11.glPushMatrix();
GL11.glTranslated(0.5, 0, 0.5);
GL11.glRotated((anim * 15) % 360D, 0, 1, 0);
GL11.glTranslated(-0.5, 0, -0.5);
ResourceManager.chemical_plant.renderPart("Spinner");
GL11.glPopMatrix();
if(chemplant.didProcess && recipe != null) {
int colors = 0;
int r = 0;
int g = 0;
int b = 0;
if(recipe.outputFluid != null) for(FluidStack stack : recipe.outputFluid) {
Color color = new Color(stack.type.getColor());
r += color.getRed();
g += color.getGreen();
b += color.getBlue();
colors++;
}
if(colors == 0 && recipe.inputFluid != null) for(FluidStack stack : recipe.inputFluid) {
Color color = new Color(stack.type.getColor());
r += color.getRed();
g += color.getGreen();
b += color.getBlue();
colors++;
}
if(colors > 0) {
bindTexture(ResourceManager.chemical_plant_fluid_tex);
GL11.glPushMatrix();
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_BLEND);
GL11.glAlphaFunc(GL11.GL_GREATER, 0);
OpenGlHelper.glBlendFunc(770, 771, 1, 0);
GL11.glColor4f(r / 255F / colors, g / 255F / colors, b / 255F / colors, 0.5F);
GL11.glDepthMask(false);
GL11.glMatrixMode(GL11.GL_TEXTURE);
GL11.glLoadIdentity();
GL11.glTranslated(-anim / 100F, BobMathUtil.sps(anim * 0.1) * 0.1 - 0.25, 0);
ResourceManager.chemical_plant.renderPart("Fluid");
GL11.glMatrixMode(GL11.GL_TEXTURE);
GL11.glLoadIdentity();
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glDepthMask(true);
GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F);
GL11.glDisable(GL11.GL_BLEND);
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
GL11.glPopMatrix();
}
}
GL11.glShadeModel(GL11.GL_FLAT);
GL11.glPopMatrix();
@ -48,7 +130,9 @@ public class RenderChemicalPlant extends TileEntitySpecialRenderer implements II
GL11.glScaled(0.75, 0.75, 0.75);
GL11.glShadeModel(GL11.GL_SMOOTH);
bindTexture(ResourceManager.chemical_plant_tex);
ResourceManager.chemical_plant.renderAll();
ResourceManager.chemical_plant.renderPart("Base");
ResourceManager.chemical_plant.renderPart("Slider");
ResourceManager.chemical_plant.renderPart("Spinner");
GL11.glShadeModel(GL11.GL_FLAT);
}};
}

View File

@ -67,19 +67,15 @@ public class RenderNTMSkyboxChainloader extends IRenderHandler { //why an abstra
GL11.glDisable(GL11.GL_FOG);
OpenGlHelper.glBlendFunc(770, 1, 1, 0);
float brightness = (float) Math.sin(world.getCelestialAngle(partialTicks) * Math.PI);
brightness *= brightness;
GL11.glColor4f(brightness, brightness, brightness, 1.0F);
float var12 = 1F + world.rand.nextFloat() * 0.5F;
float var12 = 0.5F + world.rand.nextFloat() * 0.25F;
double dist = 100D;
if(ModEventHandlerClient.renderLodeStar) {
GL11.glPushMatrix();
GL11.glRotatef(-75.0F, 1.0F, 0.0F, 0.0F);
GL11.glRotatef(10.0F, 0.0F, 1.0F, 0.0F);
FMLClientHandler.instance().getClient().renderEngine.bindTexture(lodeStar); // GENUINELY shut the fuck up i'm not kidding
GL11.glColor4f(1F, 1F, 1F, 1.0F);
FMLClientHandler.instance().getClient().renderEngine.bindTexture(lodeStar);
tessellator.startDrawingQuads();
tessellator.addVertexWithUV(-var12, dist, -var12, 0.0D, 0.0D);
@ -91,6 +87,11 @@ public class RenderNTMSkyboxChainloader extends IRenderHandler { //why an abstra
GL11.glPopMatrix();
}
float brightness = (float) Math.sin(world.getCelestialAngle(partialTicks) * Math.PI);
brightness *= brightness;
GL11.glColor4f(brightness, brightness, brightness, 1.0F);
GL11.glPushMatrix();
GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F);
GL11.glRotatef(world.getCelestialAngle(partialTicks) * 360.0F, 1.0F, 0.0F, 0.0F);

View File

@ -42,6 +42,10 @@ public class TileEntityMachineChemicalPlant extends TileEntityMachineBase implem
public long power;
public long maxPower = 1_000_000;
public boolean didProcess = false;
public boolean frame = false;
public int anim;
public int prevAnim;
public ModuleMachineChemplant chemplantModule;
public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(this);
@ -98,6 +102,12 @@ public class TileEntityMachineChemicalPlant extends TileEntityMachineBase implem
} else {
this.prevAnim = this.anim;
if(this.didProcess) this.anim++;
if(worldObj.getTotalWorldTime() % 40 == 0) {
frame = !worldObj.getBlock(xCoord, yCoord + 3, zCoord).isAir(worldObj, xCoord, yCoord + 3, zCoord);
}
}
}
@ -125,6 +135,7 @@ public class TileEntityMachineChemicalPlant extends TileEntityMachineBase implem
for(FluidTank tank : outputTanks) tank.serialize(buf);
buf.writeLong(power);
buf.writeLong(maxPower);
buf.writeBoolean(didProcess);
this.chemplantModule.serialize(buf);
}
@ -135,6 +146,7 @@ public class TileEntityMachineChemicalPlant extends TileEntityMachineBase implem
for(FluidTank tank : outputTanks) tank.deserialize(buf);
this.power = buf.readLong();
this.maxPower = buf.readLong();
this.didProcess = buf.readBoolean();
this.chemplantModule.deserialize(buf);
}

View File

@ -177,6 +177,21 @@ cannery.stirling.1=Er muss auf einem Hitzeerzeuger platziert werden, zum Beispie
cannery.stirling.2=Die Hitze die maximal verwendet werden kann ist limitiert, Übergeschwindigkeit kann zu katastrophalen Fehlfunktionen führen.
cannery.stirling.3=Die verbesserte Version kann wesentlich mehr Hitze aufnehmen, ohne kaputt zu werden.
chem.hydrogen=Wasserstoff
chem.hydrogencoke=Wasserstoff aus Koks
chem.oxygen=Sauerstoff
chem.xenon=Xenongas
chem.xenonoxy=Xenongas (Gekühlt)
chem.helium3=Helium-3
chem.ethanol=Ethanol
chem.biogas=Biogas
chem.biofuel=Biodieselumesterung
chem.reoil=Wiederaufbereitetes Öl
chem.gasoline=Benzin
chem.tarsand=Bitumen aus Teersand
chem.meatprocessing=Glyphidflesch-Verarbeitung
chem.birkeland=Salpetersäure aus Luft
chem.ARSENIC=Arsenextraktion
chem.ASPHALT=Asphaltherstellung
chem.BAKELITE=Bakelitherstellung
@ -2770,6 +2785,7 @@ item.part_barrel_light.name=Leichter %slauf
item.part_beryllium.name=Berylliumstaubkiste
item.part_carbon.name=Kohlenstoffstaubkiste
item.part_copper.name=Kupferstaubkiste
item.part_generic.glass_polarized.name=Polarisierte Linse
item.part_generic.hde.name=Schwerlastkomponente
item.part_generic.lde.name=Leichtbauteil
item.part_generic.piston_electric.name=Electrischer Kolben
@ -4219,6 +4235,7 @@ tile.geiger.name=Geigerzähler
tile.glass_ash.name=Ascheglas
tile.glass_boron.name=Borglas
tile.glass_lead.name=Bleiglas
tile.glass_polarized.name=Polarisiertes Glas
tile.glass_polonium.name=Poloniumglas
tile.glass_quartz.name=Quarzglas
tile.glass_trinitite.name=Trinity-Glas

View File

@ -566,6 +566,21 @@ cannery.schottky.7=If any virtual particles encounter any malformed segments, al
cannery.schottky.8=Note that virtual particles will never use the same Diode exit twice. Infinite loops will fail, but re-entering a Diode is otherwise fine
cannery.schottky.9=Your Schottky Particle Diode should be properly enclosed, with free paths for each intersection exit
chem.hydrogen=Hydrogen
chem.hydrogencoke=Hydrogen from Coke
chem.oxygen=Oxygen
chem.xenon=Xenon Gas
chem.xenonoxy=Xenon Gas (Cooled)
chem.helium3=Helium-3
chem.ethanol=Ethanol
chem.biogas=Biogas
chem.biofuel=Biofuel Transesterification
chem.reoil=Reclaimed Oil
chem.gasoline=Gasoline
chem.tarsand=Bitumen from Tar Sand
chem.meatprocessing=Glyphid Meat Processing
chem.birkeland=Nitric Acid from Air
chem.ARSENIC=Arsenic Extraction
chem.ASPHALT=Asphalt Production
chem.BAKELITE=Bakelite Production
@ -3620,6 +3635,7 @@ item.part_barrel_light.name=Light %s Barrel
item.part_beryllium.name=Box of Beryllium Dust
item.part_carbon.name=Box of Carbon Dust
item.part_copper.name=Box of Copper Dust
item.part_generic.glass_polarized.name=Polarized Lens
item.part_generic.hde.name=Heavy Duty Element
item.part_generic.lde.name=Low-Density Element
item.part_generic.piston_electric.name=Electric Piston
@ -5344,6 +5360,7 @@ tile.geiger.name=Geiger Counter
tile.glass_ash.name=Ash Glass
tile.glass_boron.name=Boron Glass
tile.glass_lead.name=Lead Glass
tile.glass_polarized.name=Polarized Glass
tile.glass_polonium.name=Polonium Glass
tile.glass_quartz.name=Quartz Glass
tile.glass_trinitite.name=Trinity Glass

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 211 B

After

Width:  |  Height:  |  Size: 224 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 456 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 B

After

Width:  |  Height:  |  Size: 495 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB