From 4d2ced4528634e6d2f0a28e679c07d13e9b6eaeb Mon Sep 17 00:00:00 2001 From: Kam Date: Mon, 27 Jan 2025 17:21:11 -0500 Subject: [PATCH] Updated Banners --- .../java/noppes/npcs/ServerEventsHandler.java | 15 ++- .../noppes/npcs/blocks/tiles/TileBanner.java | 16 ++- .../npcs/client/model/blocks/ModelStool.java | 27 +++-- .../blocks/banner/ModelBannerFloorFlag.java | 35 +++--- .../model/blocks/banner/ModelBannerWall.java | 37 +++++++ .../blocks/banner/ModelBannerWallFlag.java | 31 ++++++ .../blocks/legacy/ModelLegacyWallBanner.java | 6 -- .../renderer/blocks/BlockBannerRenderer.java | 102 ++++++++++++++---- .../blocks/BlockCarpentryBenchRenderer.java | 4 +- .../renderer/blocks/BlockChairRenderer.java | 2 + .../renderer/blocks/BlockStoolRenderer.java | 10 +- .../blocks/BlockWallBannerRenderer.java | 101 +++++++++++++---- .../java/noppes/npcs/config/ConfigClient.java | 8 ++ .../npcs/constants/EnumBannerVariant.java | 5 + .../models/banner/flag/BannerFlag1.png | Bin 270 -> 0 bytes .../models/banner/flag/BannerFlag2.png | Bin 282 -> 0 bytes .../models/banner/flag/BannerFlag3.png | Bin 297 -> 0 bytes .../models/banner/flag/BannerFlag4.png | Bin 407 -> 0 bytes .../models/banner/flag/BannerFlag5.png | Bin 270 -> 0 bytes .../textures/models/banner/flag/curved.png | Bin 0 -> 284 bytes .../textures/models/banner/flag/normal.png | Bin 0 -> 319 bytes .../textures/models/banner/flag/pointy.png | Bin 0 -> 305 bytes .../textures/models/banner/flag/torn.png | Bin 0 -> 447 bytes .../textures/models/banner/flag/triangle.png | Bin 0 -> 328 bytes .../customnpcs/textures/models/stool/oak.png | Bin 607 -> 399 bytes 25 files changed, 314 insertions(+), 85 deletions(-) create mode 100644 src/main/java/noppes/npcs/client/model/blocks/banner/ModelBannerWall.java create mode 100644 src/main/java/noppes/npcs/client/model/blocks/banner/ModelBannerWallFlag.java create mode 100644 src/main/java/noppes/npcs/constants/EnumBannerVariant.java delete mode 100644 src/main/resources/assets/customnpcs/textures/models/banner/flag/BannerFlag1.png delete mode 100644 src/main/resources/assets/customnpcs/textures/models/banner/flag/BannerFlag2.png delete mode 100644 src/main/resources/assets/customnpcs/textures/models/banner/flag/BannerFlag3.png delete mode 100644 src/main/resources/assets/customnpcs/textures/models/banner/flag/BannerFlag4.png delete mode 100644 src/main/resources/assets/customnpcs/textures/models/banner/flag/BannerFlag5.png create mode 100644 src/main/resources/assets/customnpcs/textures/models/banner/flag/curved.png create mode 100644 src/main/resources/assets/customnpcs/textures/models/banner/flag/normal.png create mode 100644 src/main/resources/assets/customnpcs/textures/models/banner/flag/pointy.png create mode 100644 src/main/resources/assets/customnpcs/textures/models/banner/flag/torn.png create mode 100644 src/main/resources/assets/customnpcs/textures/models/banner/flag/triangle.png diff --git a/src/main/java/noppes/npcs/ServerEventsHandler.java b/src/main/java/noppes/npcs/ServerEventsHandler.java index e4c8b9ff6..f67759ed5 100644 --- a/src/main/java/noppes/npcs/ServerEventsHandler.java +++ b/src/main/java/noppes/npcs/ServerEventsHandler.java @@ -11,6 +11,7 @@ import net.minecraft.entity.passive.EntityVillager; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; +import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; @@ -255,11 +256,23 @@ public class ServerEventsHandler { } if(!player.worldObj.isRemote){ + if(block == CustomItems.banner || block == CustomItems.wallBanner){ + // If sneaking and using shear + if(player.isSneaking() && item.getItem() == Items.shears){ + int currentVariantIndex = tile.variant.ordinal(); + int nextVariantIndex = (currentVariantIndex + 1) % EnumBannerVariant.values().length; + tile.variant = EnumBannerVariant.values()[nextVariantIndex]; + + player.worldObj.markBlockForUpdate(event.x, y, event.z); + event.setCanceled(true); + return; + } + } + tile.icon = item.copy(); player.worldObj.markBlockForUpdate(event.x, y, event.z); event.setCanceled(true); } - } } diff --git a/src/main/java/noppes/npcs/blocks/tiles/TileBanner.java b/src/main/java/noppes/npcs/blocks/tiles/TileBanner.java index bb8075346..3cbc87b43 100644 --- a/src/main/java/noppes/npcs/blocks/tiles/TileBanner.java +++ b/src/main/java/noppes/npcs/blocks/tiles/TileBanner.java @@ -3,29 +3,39 @@ package noppes.npcs.blocks.tiles; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; +import noppes.npcs.constants.EnumBannerVariant; public class TileBanner extends TileColorable { - + public ItemStack icon; + public EnumBannerVariant variant = EnumBannerVariant.Normal; public long time = 0; public void readFromNBT(NBTTagCompound compound){ super.readFromNBT(compound); icon = ItemStack.loadItemStackFromNBT(compound.getCompoundTag("BannerIcon")); + + int variantIndex = compound.getInteger("BannerVariant"); + if (variantIndex >= 0 && variantIndex < EnumBannerVariant.values().length) { + variant = EnumBannerVariant.values()[variantIndex]; + } else { + variant = EnumBannerVariant.Normal; + } } public void writeToNBT(NBTTagCompound compound){ super.writeToNBT(compound); if(icon != null) compound.setTag("BannerIcon", icon.writeToNBT(new NBTTagCompound())); + compound.setInteger("BannerVariant", variant.ordinal()); } @Override public AxisAlignedBB getRenderBoundingBox(){ return AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 2, zCoord + 1); } - + public boolean canEdit(){ - return System.currentTimeMillis() - time < 10000; + return System.currentTimeMillis() - time < 20000; } } diff --git a/src/main/java/noppes/npcs/client/model/blocks/ModelStool.java b/src/main/java/noppes/npcs/client/model/blocks/ModelStool.java index 2cf65f015..429e5ea96 100644 --- a/src/main/java/noppes/npcs/client/model/blocks/ModelStool.java +++ b/src/main/java/noppes/npcs/client/model/blocks/ModelStool.java @@ -9,21 +9,20 @@ public class ModelStool extends ModelBase { private final ModelRenderer stool; public ModelStool() { - textureWidth = 64; - textureHeight = 64; + textureWidth = 64; + textureHeight = 32; - stool = new ModelRenderer(this); - stool.setRotationPoint(0.0F, 24.0F, 0.0F); - stool.cubeList.add(new ModelBox(stool, 0, 0, -5.0F, -9.0F, -5.0F, 10, 2, 10, 0.0F)); - stool.cubeList.add(new ModelBox(stool, 0, 12, 2.0F, -7.0F, -4.0F, 2, 7, 2, 0.0F)); - stool.cubeList.add(new ModelBox(stool, 8, 8, 3.0F, -5.0F, -2.0F, 0, 2, 4, 0.0F)); - stool.cubeList.add(new ModelBox(stool, 8, 12, -2.0F, -5.0F, -3.0F, 4, 2, 0, 0.0F)); - stool.cubeList.add(new ModelBox(stool, 0, 12, -4.0F, -7.0F, -4.0F, 2, 7, 2, 0.0F)); - stool.cubeList.add(new ModelBox(stool, 0, 12, -4.0F, -7.0F, 2.0F, 2, 7, 2, 0.0F)); - stool.cubeList.add(new ModelBox(stool, 8, 8, -3.0F, -5.0F, -2.0F, 0, 2, 4, 0.0F)); - stool.cubeList.add(new ModelBox(stool, 0, 12, 2.0F, -7.0F, 2.0F, 2, 7, 2, 0.0F)); - stool.cubeList.add(new ModelBox(stool, 8, 12, -2.0F, -5.0F, 3.0F, 4, 2, 0, 0.0F)); - } + stool = new ModelRenderer(this); + stool.setRotationPoint(0.0F, 24.0F, 0.0F); + stool.cubeList.add(new ModelBox(stool, 0, 0, -5.0F, -9.0F, -5.0F, 10, 2, 10, 0.0F)); + stool.cubeList.add(new ModelBox(stool, 0, 12, 2.0F, -7.0F, -4.0F, 2, 7, 2, 0.0F)); + stool.cubeList.add(new ModelBox(stool, 8, 8, 3.0F, -5.0F, -2.0F, 0, 2, 4, 0.0F)); + stool.cubeList.add(new ModelBox(stool, 8, 12, -2.0F, -5.0F, -3.0F, 4, 2, 0, 0.0F)); + stool.cubeList.add(new ModelBox(stool, 0, 12, -4.0F, -7.0F, -4.0F, 2, 7, 2, 0.0F)); + stool.cubeList.add(new ModelBox(stool, 0, 12, -4.0F, -7.0F, 2.0F, 2, 7, 2, 0.0F)); + stool.cubeList.add(new ModelBox(stool, 8, 8, -3.0F, -5.0F, -2.0F, 0, 2, 4, 0.0F)); + stool.cubeList.add(new ModelBox(stool, 0, 12, 2.0F, -7.0F, 2.0F, 2, 7, 2, 0.0F)); + stool.cubeList.add(new ModelBox(stool, 8, 12, -2.0F, -5.0F, 3.0F, 4, 2, 0, 0.0F)); } @Override public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { diff --git a/src/main/java/noppes/npcs/client/model/blocks/banner/ModelBannerFloorFlag.java b/src/main/java/noppes/npcs/client/model/blocks/banner/ModelBannerFloorFlag.java index 25adeb70d..030145314 100644 --- a/src/main/java/noppes/npcs/client/model/blocks/banner/ModelBannerFloorFlag.java +++ b/src/main/java/noppes/npcs/client/model/blocks/banner/ModelBannerFloorFlag.java @@ -6,25 +6,26 @@ import net.minecraft.client.model.ModelRenderer; import net.minecraft.entity.Entity; public class ModelBannerFloorFlag extends ModelBase { - private final ModelRenderer BannerFlag; + public final ModelRenderer BannerFlag; - public ModelBannerFloorFlag() { - textureWidth = 32; - textureHeight = 32; + public ModelBannerFloorFlag() { + textureWidth = 32; + textureHeight = 32; - BannerFlag = new ModelRenderer(this); - BannerFlag.setRotationPoint(0.0F, -8.0F, 5.0F); - BannerFlag.cubeList.add(new ModelBox(BannerFlag, 0, 0, -8.0F, 0.0F, -6.05F, 16, 32, 0, 0.0F)); - } + BannerFlag = new ModelRenderer(this); + BannerFlag.setRotationPoint(0.0F, -8.0F, 5.0F); + BannerFlag.cubeList.add(new ModelBox(BannerFlag, 2, 0, -7.0F, 0.4F, -6.05F, 14, 29, 0, 0.0F)); + } - @Override - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - BannerFlag.render(f5); - } + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + // Render the flag + BannerFlag.render(f5); + } - public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { - modelRenderer.rotateAngleX = x; - modelRenderer.rotateAngleY = y; - modelRenderer.rotateAngleZ = z; - } + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } } diff --git a/src/main/java/noppes/npcs/client/model/blocks/banner/ModelBannerWall.java b/src/main/java/noppes/npcs/client/model/blocks/banner/ModelBannerWall.java new file mode 100644 index 000000000..e3756d963 --- /dev/null +++ b/src/main/java/noppes/npcs/client/model/blocks/banner/ModelBannerWall.java @@ -0,0 +1,37 @@ +package noppes.npcs.client.model.blocks.banner; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelBox; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +public class ModelBannerWall extends ModelBase { + private final ModelRenderer bb_main; + private final ModelRenderer cube_r1; + + public ModelBannerWall() { + textureWidth = 64; + textureHeight = 64; + + bb_main = new ModelRenderer(this); + bb_main.setRotationPoint(0.0F, 24.0F, 0.0F); + bb_main.cubeList.add(new ModelBox(bb_main, 0, 0, -8.0F, -32.0F, 5.0F, 16, 3, 3, 0.0F)); + bb_main.cubeList.add(new ModelBox(bb_main, 0, 8, -6.0F, -36.0F, 6.5F, 4, 4, 0, 0.0F)); + + cube_r1 = new ModelRenderer(this); + cube_r1.setRotationPoint(4.0F, -34.0F, 6.5F); + bb_main.addChild(cube_r1); + setRotationAngle(cube_r1, 0.0F, 3.1416F, 0.0F); + cube_r1.cubeList.add(new ModelBox(cube_r1, 0, 8, -2.0F, -2.0F, 0.0F, 4, 4, 0, 0.0F));} + + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + bb_main.render(f5); + } + + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } +} diff --git a/src/main/java/noppes/npcs/client/model/blocks/banner/ModelBannerWallFlag.java b/src/main/java/noppes/npcs/client/model/blocks/banner/ModelBannerWallFlag.java new file mode 100644 index 000000000..486db9504 --- /dev/null +++ b/src/main/java/noppes/npcs/client/model/blocks/banner/ModelBannerWallFlag.java @@ -0,0 +1,31 @@ +package noppes.npcs.client.model.blocks.banner; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelBox; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +public class ModelBannerWallFlag extends ModelBase { + public final ModelRenderer BannerFlag; + + public ModelBannerWallFlag() { + textureWidth = 32; + textureHeight = 32; + + BannerFlag = new ModelRenderer(this); + BannerFlag.setRotationPoint(0.0F, -8.0F, 5.0F); + BannerFlag.cubeList.add(new ModelBox(BannerFlag, 2, 0, -7.0F, 0.4F, -0.05F, 14, 29, 0, 0.0F)); + } + + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + // Render the flag + BannerFlag.render(f5); + } + + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } +} diff --git a/src/main/java/noppes/npcs/client/model/blocks/legacy/ModelLegacyWallBanner.java b/src/main/java/noppes/npcs/client/model/blocks/legacy/ModelLegacyWallBanner.java index 851201603..8c3a6dd8a 100644 --- a/src/main/java/noppes/npcs/client/model/blocks/legacy/ModelLegacyWallBanner.java +++ b/src/main/java/noppes/npcs/client/model/blocks/legacy/ModelLegacyWallBanner.java @@ -1,9 +1,3 @@ -// Date: 21-2-2014 11:50:33 -// Template version 1.1 -// Java generated by Techne -// Keep in mind that you still need to fill in some blanks -// - ZeuX - package noppes.npcs.client.model.blocks.legacy; import net.minecraft.client.model.ModelBase; diff --git a/src/main/java/noppes/npcs/client/renderer/blocks/BlockBannerRenderer.java b/src/main/java/noppes/npcs/client/renderer/blocks/BlockBannerRenderer.java index f428c0372..2bfc59e26 100644 --- a/src/main/java/noppes/npcs/client/renderer/blocks/BlockBannerRenderer.java +++ b/src/main/java/noppes/npcs/client/renderer/blocks/BlockBannerRenderer.java @@ -10,6 +10,7 @@ import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; import noppes.npcs.CustomItems; import noppes.npcs.blocks.BlockBanner; @@ -19,6 +20,7 @@ import noppes.npcs.client.model.blocks.banner.ModelBannerFloorFlag; import noppes.npcs.client.model.blocks.legacy.ModelLegacyBanner; import noppes.npcs.client.model.blocks.legacy.ModelLegacyBannerFlag; import noppes.npcs.config.ConfigClient; +import noppes.npcs.constants.EnumBannerVariant; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; @@ -30,9 +32,13 @@ public class BlockBannerRenderer extends BlockRendererInterface{ private final ModelBannerFloor banner = new ModelBannerFloor(); private final ModelBannerFloorFlag flag = new ModelBannerFloorFlag(); - public static final ResourceLocation legacyFlagResource = new ResourceLocation("customnpcs","textures/models/BannerFlag.png"); - public static final ResourceLocation flagResource = new ResourceLocation("customnpcs","textures/models/banner/flag/BannerFlag1.png"); + + public static final ResourceLocation normalFlag = new ResourceLocation("customnpcs","textures/models/banner/flag/normal.png"); + public static final ResourceLocation pointyFlag = new ResourceLocation("customnpcs","textures/models/banner/flag/pointy.png"); + public static final ResourceLocation triangleFlag = new ResourceLocation("customnpcs","textures/models/banner/flag/triangle.png"); + public static final ResourceLocation tornFlag = new ResourceLocation("customnpcs","textures/models/banner/flag/torn.png"); + public static final ResourceLocation curvedFlag = new ResourceLocation("customnpcs","textures/models/banner/flag/curved.png"); protected static final ResourceLocation BannerWood = new ResourceLocation("customnpcs","textures/models/banner/BannerFloorWood.png"); protected static final ResourceLocation BannerStone = new ResourceLocation("customnpcs","textures/models/banner/BannerFloorStone.png"); @@ -66,31 +72,56 @@ public class BlockBannerRenderer extends BlockRendererInterface{ float[] color = colorTable[tile.color]; GL11.glColor3f(color[0], color[1], color[2]); legacyFlag.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(1, 1, 1); + if(tile.icon != null && !this.playerTooFar(tile)){ + doRender(var2, var4, var6, tile.rotation, tile.icon, 0); + } } else { + long worldTime = tile.getWorldObj() != null ? tile.getWorldObj().getTotalWorldTime() : 0; + // 100 is one full revolution, so we can just mod by 100 without affecting the result + int animationProgress100 = (((tile.xCoord % 100) * 7 + (tile.yCoord % 100) * 9 + (tile.zCoord % 100) * 13) + (int) (worldTime % 100)) % 100; + float f3 = (float) animationProgress100 + var8; + float angle_x = (-0.0125F + 0.01F * MathHelper.cos(f3 * 0.01F * 2F * (float) Math.PI)) * (float) Math.PI; + flag.BannerFlag.rotateAngleX = angle_x; + setBannerMaterial(var1.getBlockMetadata()); banner.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); - this.bindTexture(flagResource); + setFlagType(tile.variant); float[] color = colorTable[tile.color]; + GL11.glPushMatrix(); GL11.glColor3f(color[0], color[1], color[2]); - flag.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); - } + flag.render(null, 0, 0, 0, f3, 0.0F, 0.0625F); + GL11.glPopMatrix(); - GL11.glPopMatrix(); - GL11.glColor3f(1, 1, 1); - if(tile.icon != null && !this.playerTooFar(tile)){ - doRender(var2, var4, var6, tile.rotation, tile.icon); + GL11.glPopMatrix(); + GL11.glColor3f(1, 1, 1); + if(tile.icon != null && !this.playerTooFar(tile)){ + doRender(var2, var4, var6, tile.rotation, tile.icon, angle_x); + } } } - public void doRender(double par2, double par4, double par6, int meta, ItemStack iicon) + public void doRender(double par2, double par4, double par6, int meta, ItemStack iicon, float rotate) { GL11.glPushMatrix(); bindTexture(TextureMap.locationItemsTexture); GL11.glTranslatef((float)par2 + 0.5f, (float)par4 +1.3f, (float)par6 + 0.5f); GL11.glRotatef(180, 0, 0, 1); GL11.glRotatef(90 * meta, 0, 1, 0); - GL11.glTranslatef(0, 0, -0.14f); + if(ConfigClient.LegacyBanner){ + GL11.glTranslatef(0, 0, -0.14f); + } + else { + GL11.glTranslatef(0, 0, -0.075f); + + GL11.glTranslatef(0, -0.6f, 0); // Translate to pivot point + GL11.glRotatef((float) Math.toDegrees(rotate), 1, 0, 0); // Apply sway rotation + GL11.glTranslatef(0, 0.6f, 0); // Translate back after rotation + } + GL11.glDepthMask(false); float f2 = 0.05f; Minecraft mc = Minecraft.getMinecraft(); @@ -156,14 +187,26 @@ public class BlockBannerRenderer extends BlockRendererInterface{ GL11.glRotatef(180, 0, 0, 1); GL11.glRotatef(180, 0, 1, 0); - setMaterialTexture(metadata); - GL11.glColor3f(1, 1, 1); - legacyBanner.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); + if(ConfigClient.LegacyBanner){ + setMaterialTexture(metadata); + GL11.glColor3f(1, 1, 1); + legacyBanner.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); + + this.bindTexture(legacyFlagResource); + float[] color = colorTable[15 - metadata]; + GL11.glColor3f(color[0], color[1], color[2]); + legacyFlag.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); + } + else { + setBannerMaterial(metadata); + banner.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); + + this.bindTexture(normalFlag); + float[] color = colorTable[15 - metadata]; + GL11.glColor3f(color[0], color[1], color[2]); + flag.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); + } - this.bindTexture(legacyFlagResource); - float[] color = colorTable[15 - metadata]; - GL11.glColor3f(color[0], color[1], color[2]); - legacyFlag.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); GL11.glPopMatrix(); } @@ -176,7 +219,7 @@ public class BlockBannerRenderer extends BlockRendererInterface{ return 26; } - public void setBannerMaterial(int meta){ + public static void setBannerMaterial(int meta){ TextureManager manager = Minecraft.getMinecraft().getTextureManager(); if(meta == 1) manager.bindTexture(BannerStone); @@ -189,4 +232,25 @@ public class BlockBannerRenderer extends BlockRendererInterface{ else manager.bindTexture(BannerWood); } + + public static void setFlagType(EnumBannerVariant variant){ + TextureManager manager = Minecraft.getMinecraft().getTextureManager(); + switch (variant){ + case Pointy: + manager.bindTexture(pointyFlag); + break; + case Triangle: + manager.bindTexture(triangleFlag); + break; + case Torn: + manager.bindTexture(tornFlag); + break; + case Curved: + manager.bindTexture(curvedFlag); + break; + default: + manager.bindTexture(normalFlag); + break; + } + } } diff --git a/src/main/java/noppes/npcs/client/renderer/blocks/BlockCarpentryBenchRenderer.java b/src/main/java/noppes/npcs/client/renderer/blocks/BlockCarpentryBenchRenderer.java index 57c8c5f43..81a8de7d3 100644 --- a/src/main/java/noppes/npcs/client/renderer/blocks/BlockCarpentryBenchRenderer.java +++ b/src/main/java/noppes/npcs/client/renderer/blocks/BlockCarpentryBenchRenderer.java @@ -40,9 +40,11 @@ public class BlockCarpentryBenchRenderer extends TileEntitySpecialRenderer imple this.bindTexture(anvilTexture); anvil.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); } - else{ + else { + GL11.glEnable(GL11.GL_ALPHA_TEST); this.bindTexture(carpentryBench); model.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); + GL11.glDisable(GL11.GL_ALPHA_TEST); } GL11.glPopMatrix(); } diff --git a/src/main/java/noppes/npcs/client/renderer/blocks/BlockChairRenderer.java b/src/main/java/noppes/npcs/client/renderer/blocks/BlockChairRenderer.java index d5a04a32c..86ff10676 100644 --- a/src/main/java/noppes/npcs/client/renderer/blocks/BlockChairRenderer.java +++ b/src/main/java/noppes/npcs/client/renderer/blocks/BlockChairRenderer.java @@ -34,11 +34,13 @@ public class BlockChairRenderer extends BlockRendererInterface{ GL11.glRotatef(90 * tile.rotation, 0, 1, 0); GL11.glColor3f(1, 1, 1); + GL11.glEnable(GL11.GL_ALPHA_TEST); setWoodTexture(var1.getBlockMetadata()); if(ConfigClient.LegacyChair) legacyModel.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); else model.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); + GL11.glDisable(GL11.GL_ALPHA_TEST); GL11.glPopMatrix(); } diff --git a/src/main/java/noppes/npcs/client/renderer/blocks/BlockStoolRenderer.java b/src/main/java/noppes/npcs/client/renderer/blocks/BlockStoolRenderer.java index cecdfce85..32ea1655c 100644 --- a/src/main/java/noppes/npcs/client/renderer/blocks/BlockStoolRenderer.java +++ b/src/main/java/noppes/npcs/client/renderer/blocks/BlockStoolRenderer.java @@ -38,14 +38,22 @@ public class BlockStoolRenderer extends BlockRendererInterface{ GL11.glRotatef(180, 0, 0, 1); GL11.glColor3f(1, 1, 1); + + GL11.glEnable(GL11.GL_ALPHA_TEST); if(ConfigClient.LegacyStool){ setWoodTexture(var1.getBlockMetadata()); legacyStool.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); } else { - setStoolTexture(var1.getBlockMetadata()); + if(ConfigClient.WoodTextures) { + setWoodTexture(var1.getBlockMetadata()); + } + else { + setStoolTexture(var1.getBlockMetadata()); + } stool.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); } + GL11.glDisable(GL11.GL_ALPHA_TEST); GL11.glPopMatrix(); } diff --git a/src/main/java/noppes/npcs/client/renderer/blocks/BlockWallBannerRenderer.java b/src/main/java/noppes/npcs/client/renderer/blocks/BlockWallBannerRenderer.java index 0b83c9fa3..8ccbe2f75 100644 --- a/src/main/java/noppes/npcs/client/renderer/blocks/BlockWallBannerRenderer.java +++ b/src/main/java/noppes/npcs/client/renderer/blocks/BlockWallBannerRenderer.java @@ -11,19 +11,26 @@ import net.minecraft.init.Blocks; import net.minecraft.item.*; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; import noppes.npcs.CustomItems; import noppes.npcs.blocks.BlockWallBanner; import noppes.npcs.blocks.tiles.TileWallBanner; +import noppes.npcs.client.model.blocks.banner.ModelBannerWall; +import noppes.npcs.client.model.blocks.banner.ModelBannerWallFlag; import noppes.npcs.client.model.blocks.legacy.ModelLegacyWallBanner; import noppes.npcs.client.model.blocks.legacy.ModelLegacyWallBannerFlag; +import noppes.npcs.config.ConfigClient; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; public class BlockWallBannerRenderer extends BlockRendererInterface{ - private final ModelLegacyWallBanner model = new ModelLegacyWallBanner(); - private final ModelLegacyWallBannerFlag flag = new ModelLegacyWallBannerFlag(); + private final ModelLegacyWallBanner modelLegacyWallBanner = new ModelLegacyWallBanner(); + private final ModelLegacyWallBannerFlag modelLegacyWallBannerFlag = new ModelLegacyWallBannerFlag(); + + private final ModelBannerWall model = new ModelBannerWall(); + private final ModelBannerWallFlag flag = new ModelBannerWallFlag(); public BlockWallBannerRenderer(){ ((BlockWallBanner)CustomItems.wallBanner).renderId = RenderingRegistry.getNextAvailableRenderId(); @@ -42,29 +49,66 @@ public class BlockWallBannerRenderer extends BlockRendererInterface{ GL11.glRotatef(180, 0, 0, 1); GL11.glRotatef(90 * tile.rotation, 0, 1, 0); - setMaterialTexture(var1.getBlockMetadata()); - GL11.glColor3f(1, 1, 1); - model.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); + if(ConfigClient.LegacyBanner){ + setMaterialTexture(var1.getBlockMetadata()); + GL11.glColor3f(1, 1, 1); + modelLegacyWallBanner.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); - this.bindTexture(BlockBannerRenderer.legacyFlagResource); - float[] color = BlockBannerRenderer.colorTable[tile.color]; - GL11.glColor3f(color[0], color[1], color[2]); - flag.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); + this.bindTexture(BlockBannerRenderer.legacyFlagResource); + float[] color = BlockBannerRenderer.colorTable[tile.color]; + GL11.glColor3f(color[0], color[1], color[2]); + modelLegacyWallBannerFlag.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); - GL11.glPopMatrix(); - GL11.glColor3f(1, 1, 1); - if(tile.icon != null && !this.playerTooFar(tile)){ - doRender(var2, var4, var6, tile.rotation, tile.icon); + GL11.glPopMatrix(); + GL11.glColor3f(1, 1, 1); + if(tile.icon != null && !this.playerTooFar(tile)){ + doRender(var2, var4, var6, tile.rotation, tile.icon, 0); + } + } + else { + long worldTime = tile.getWorldObj() != null ? tile.getWorldObj().getTotalWorldTime() : 0; + // 100 is one full revolution, so we can just mod by 100 without affecting the result + int animationProgress100 = (((tile.xCoord % 100) * 7 + (tile.yCoord % 100) * 9 + (tile.zCoord % 100) * 13) + (int) (worldTime % 100)) % 100; + float f3 = (float) animationProgress100 + var8; + float angle_x = (-0.0125F + 0.01F * MathHelper.cos(f3 * 0.01F * 2F * (float) Math.PI)) * (float) Math.PI; + flag.BannerFlag.rotateAngleX = angle_x; + + BlockBannerRenderer.setBannerMaterial(var1.getBlockMetadata()); + model.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); + + BlockBannerRenderer.setFlagType(tile.variant); + float[] color = colorTable[tile.color]; + GL11.glPushMatrix(); + GL11.glColor3f(color[0], color[1], color[2]); + flag.render(null, 0, 0, 0, f3, 0.0F, 0.0625F); + GL11.glPopMatrix(); + + GL11.glPopMatrix(); + GL11.glColor3f(1, 1, 1); + if(tile.icon != null && !this.playerTooFar(tile)){ + doRender(var2, var4, var6, tile.rotation, tile.icon, angle_x); + } } } - public void doRender(double par2, double par4, double par6, int meta, ItemStack iicon) + public void doRender(double par2, double par4, double par6, int meta, ItemStack iicon, float rotate) { GL11.glPushMatrix(); bindTexture(TextureMap.locationItemsTexture); - GL11.glTranslatef((float)par2 + 0.5f, (float)par4 +0.2f, (float)par6 + 0.5f); + GL11.glTranslatef((float)par2 + 0.5f, (float)par4 + 0.2f, (float)par6 + 0.5f); GL11.glRotatef(180, 0, 0, 1); GL11.glRotatef(90 * meta, 0, 1, 0); - GL11.glTranslatef(0, 0, 0.26f); + + if(ConfigClient.LegacyBanner){ + GL11.glTranslatef(0, 0, 0.26f); + } + else { + GL11.glTranslatef(0, 0, 0.3f); + + GL11.glTranslatef(0, -0.6f, 0); // Translate to pivot point + GL11.glRotatef((float) Math.toDegrees(rotate), 1, 0, 0); // Apply sway rotation + GL11.glTranslatef(0, 0.6f, 0); // Translate to pivot point + } + GL11.glDepthMask(false); float f2 = 0.05f; Minecraft mc = Minecraft.getMinecraft(); @@ -148,14 +192,25 @@ public class BlockWallBannerRenderer extends BlockRendererInterface{ GL11.glRotatef(180, 0, 0, 1); GL11.glRotatef(180, 0, 1, 0); - setMaterialTexture(metadata); - GL11.glColor3f(1, 1, 1); - model.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); + if(ConfigClient.LegacyBanner){ + setMaterialTexture(metadata); + GL11.glColor3f(1, 1, 1); + modelLegacyWallBanner.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); - this.bindTexture(BlockBannerRenderer.legacyFlagResource); - float[] color = BlockBannerRenderer.colorTable[15 - metadata]; - GL11.glColor3f(color[0], color[1], color[2]); - flag.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); + this.bindTexture(BlockBannerRenderer.legacyFlagResource); + float[] color = BlockBannerRenderer.colorTable[15 - metadata]; + GL11.glColor3f(color[0], color[1], color[2]); + modelLegacyWallBannerFlag.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); + } + else { + BlockBannerRenderer.setBannerMaterial(metadata); + model.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); + + this.bindTexture(BlockBannerRenderer.normalFlag); + float[] color = colorTable[15 - metadata]; + GL11.glColor3f(color[0], color[1], color[2]); + flag.render(null, 0, 0, 0, 0, 0.0F, 0.0625F); + } GL11.glPopMatrix(); } diff --git a/src/main/java/noppes/npcs/config/ConfigClient.java b/src/main/java/noppes/npcs/config/ConfigClient.java index 22ef51590..f44dda428 100644 --- a/src/main/java/noppes/npcs/config/ConfigClient.java +++ b/src/main/java/noppes/npcs/config/ConfigClient.java @@ -17,6 +17,7 @@ public class ConfigClient public final static String VISUAL = "Visual"; public final static String QUESTING = "Questing"; public final static String MODEL = "Model"; + public final static String TEXTURE = "Texture"; /** @@ -73,6 +74,11 @@ public class ConfigClient public static Property BannerAlertsProperty; public static boolean BannerAlerts = true; + /** + * Texture Properties + **/ + public static boolean WoodTextures = false; + /** * Model Properties **/ @@ -139,6 +145,8 @@ public class ConfigClient BannerAlertsProperty = config.get(VISUAL, "All Banner Alerts", true, "Universal enable/disable for Banner Alerts"); BannerAlerts = BannerAlertsProperty.getBoolean(true); + WoodTextures = config.get(TEXTURE, "Wood Textures", false, "Models like Chairs and Stools will use default MC Wood Textures").getBoolean(false); + LegacyCampfire = config.get(MODEL, "Legacy Campfire Model", false).getBoolean(false); LegacyBanner = config.get(MODEL, "Legacy Banner Model", false).getBoolean(false); LegacyBarrel = config.get(MODEL, "Legacy Barrel Model", false).getBoolean(false); diff --git a/src/main/java/noppes/npcs/constants/EnumBannerVariant.java b/src/main/java/noppes/npcs/constants/EnumBannerVariant.java new file mode 100644 index 000000000..343d14c3f --- /dev/null +++ b/src/main/java/noppes/npcs/constants/EnumBannerVariant.java @@ -0,0 +1,5 @@ +package noppes.npcs.constants; + +public enum EnumBannerVariant { + Normal, Curved, Pointy, Triangle, Torn +} diff --git a/src/main/resources/assets/customnpcs/textures/models/banner/flag/BannerFlag1.png b/src/main/resources/assets/customnpcs/textures/models/banner/flag/BannerFlag1.png deleted file mode 100644 index 03e0daa429e693cea2b62d4917bdaefb896fd676..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCikh0(?STckkZ4cJ11uM~?ypB)3jj3Q|`RygM1AJ9M0{3{@ZgeUD52SFX!`S;TO{sV{e%WGGenT zjAPdnYMcbATDT!HPfBx{Dx$=lh?bUwn;LQ)p=gm@0N-qBG zdce+Vx8@>^u2Y921P!ga*}G-F-4vYkc7bP*rC9!#4GVTL-!Wpl%2UQ226P64r>mdK II;Vst0AmPV<^TWy diff --git a/src/main/resources/assets/customnpcs/textures/models/banner/flag/BannerFlag2.png b/src/main/resources/assets/customnpcs/textures/models/banner/flag/BannerFlag2.png deleted file mode 100644 index ea3b68322c77c2ecf27210bea5f6529b448c1b83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}S3F%DLn2z= zPB-K`tia=HAE?HErz^Nvn?LR{=My$91&gdJpWKB%&X-MY>^79M=$!d*Z~id`g_Z|h z4;soC6c!~dR990nzQ@pzTh;FQ_RO5qvyF06^_3FRq#M4(XD^#?@+sH*_Ep}s3j6Lc zb3c$|2xsd$D&RDW*>msQTswBRei6aOj=E$K{RY+z4D%R2Twi>Hv0>k=?FuE&Hiv)W znV{gNm5}(4?E-gVX5VK`4#gcINwHb7n@#i?Oj`1c()JzQ!^LnlMrqRK{fGCglz1Fi ey+<$d6{|{Yxpz$NEeW9i7(8A5T-G@yGywpaNoi#O diff --git a/src/main/resources/assets/customnpcs/textures/models/banner/flag/BannerFlag3.png b/src/main/resources/assets/customnpcs/textures/models/banner/flag/BannerFlag3.png deleted file mode 100644 index 6639685fd308503f930cec00dbe66d62a651399a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 297 zcmV+^0oMMBP)Px#<4Ht8R9J=WmoW~*APhx+P$mz#6(``hT*$Krujx`pQInJ;I4Y|6qe1wA;R_Er z=NTUo5lqumi~&H5ao7YeXaoQv+6)^n9km8cOSU=q=*Pa^dDB-0XjejXak^GE4Czi z@yD%LRhKV!&Us$XdEAQE$?^XCdmVWZfSGrjjTqy=%+CTaGg3;2olZ*09by4c)vw9d v5T4}-BC@G@Np>eZUP8dl2D7#)?J~Up9659R9hV%u00000NkvXXu0mjfi5hgO diff --git a/src/main/resources/assets/customnpcs/textures/models/banner/flag/BannerFlag4.png b/src/main/resources/assets/customnpcs/textures/models/banner/flag/BannerFlag4.png deleted file mode 100644 index 221b9c757a41a85cde975ccd401fa61f2b2a7fe5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 407 zcmV;I0cie-P)Px$QAtEWR9J=WS241MAPig_s}$7lF4UZWb8-SMWSt_dzsei+;Yc)ge;a2I+)W4@ z46U^l2QV{YjF)2okaG?{g9gk1Ktw+;M#evP>2cq?8^-e8kMm-}GvPXVELU zh=7@01WYl;9r+oy>CQO^UH4c31`COZpat7nTdxG01OPxvDU1|Vt<{YjdI~TYl_#;n zbPC=OG2w-@ng!gcW)BmB`ha3I3!XkOk9fclL$(D9bU2;s(hX~^>zxm|b;CP8;EA0NSc>ZvE4JVj zD_)kRd-Ls$c@!YFr$9tdO1ZohiHM5p}nk002ovPDHLkV1ja2 Bsh|J= diff --git a/src/main/resources/assets/customnpcs/textures/models/banner/flag/BannerFlag5.png b/src/main/resources/assets/customnpcs/textures/models/banner/flag/BannerFlag5.png deleted file mode 100644 index f2ad436b759ea003ac80c5093229354609198eb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Cp=voLn2z= zPPgVeV!+`NzbHgxU#Q>P=)enU+F|!Zm)ug~&?_6k0zja9yTXy)$f7wgq}gg*Y@ zS<+C>u_H-CP_5;6!{Zkz?Y|G)jQ4U8nD~FgBasPAK?kf^mWVDFweRFRuw6O7b>><< z#kZD>(SmV|{!cnXzb@bZ_JZrA$D$d5*>j(DcX4YhZ4u1p%4pqk|KbtOPx#)=5M`R9J=WS1}U9APiG-ojl}Mc{RWC;I&=qoMRwR+B6xgiGbx33i!-~H&RMZ zI50DoWy!`Z^zhboodDorCy6Kvv~zx4M84tyz}&T^6R|nK%$r@RxV8%s0W-sLM|e8{ z`kzX6dbBM6gg3VWdXkOuG67d01l&u2Ef6i(*ijyQ9Z~i0H5s z_waDLGY|qoK-7V#16N?OAKIF$r6N)t!?f0;Ja`9mK?8l`SxYj?%N+1-lpYv9!LN9S i2}`f0vv`5P-|+&icEbb#;6=Ou0000Px#`AI}UR9J=WmN62;APfW#PbwAsiWlgeegVHyq1I^vg8>Ijk_iP@d9W5A2i9Ql zlK1{VCJ}+Pws>x-hjY#u0C=Q>L{t=}WBGek{fGmAt!qg?R7^lbVqC%T)hbjKB7&41 z;Z6p^KGovP)r$NMx3vm-CL84n1OL!6FqeU}L9~?Cj&jKRKv3&c*Z${G?$if*eDMeV`U=PtJppR5-p|n> R2gCpX002ovPDHLkV1l-Fhh+c& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/customnpcs/textures/models/banner/flag/pointy.png b/src/main/resources/assets/customnpcs/textures/models/banner/flag/pointy.png new file mode 100644 index 0000000000000000000000000000000000000000..2bceb94cdf20eea9a35acb3f0dea6ca35b10b129 GIT binary patch literal 305 zcmV-10nYx3P)Px#>q$gGR9J=Wmpcx`APhu@Xe$@F6{q&CT)1VM1ra`h1!WUynJOQiGZ<_UgO8Zm zA(4n+-}mggr5?^&YXIOCKO~}TVEin7uc}iV0Bl`Tx=+#Xm4mVw(1{AD9D@eMP(-ln3e;b1w+Wd?eKr9o!6Y!g~*jbEqII+udXaK$R{ z!P0|gEyxU4Ekh5eYM8~@$7i{!nAw&7ny%uOmVT}`vuD$I{~aOo00000NkvXXu0mjf Di=}_M literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/customnpcs/textures/models/banner/flag/torn.png b/src/main/resources/assets/customnpcs/textures/models/banner/flag/torn.png new file mode 100644 index 0000000000000000000000000000000000000000..1eeb7c55d7e842c95b9ffbbc37f21d9e641098c6 GIT binary patch literal 447 zcmV;w0YLtVP)Px$c}YY;R9J=WmobvVAPhx6JEZt`;u#L@M=)xmk*wUoK#b85(R8q~&&qWM03f9_9gK+T1hjIU0Zi6{c950p z=D;vQb70wT>@Z76?|G4ph5S-H-DHdscwyZ?++2hp}|!<#U(n*O^S zv>IS$q?As-+nHJY0b=E*C*f~ALpuqzSLwbKS!tsfqqA~q2F_9|pEEPw?>9cdT`K3i pYyX(EwNG%T!EQqjxPSdUeFG~$M==EDUikn3002ovPDHLkV1lEz$Xx&c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/customnpcs/textures/models/banner/flag/triangle.png b/src/main/resources/assets/customnpcs/textures/models/banner/flag/triangle.png new file mode 100644 index 0000000000000000000000000000000000000000..aed0c6050f427505b0136b3fcc2701f819507c99 GIT binary patch literal 328 zcmV-O0k{5%P)Px$0!c(cR9J=WmoW~*APhx6RVNR*l~2HNb0N8!Qs= z(!TExR8m!J+txgf5sZPCg)*7Y!40jt%@C2LX8Uz2(GH@*eWrG;0oIA^*?gL4qUEMp+v)o%B@E#{3 z0ug;|#U2iq+XKtMGO+qUFF^0Cd-{Nf!)Onf8JIaRb2yu3FL!7_MDooQuUo8$3_pIB z>lzRd#27<89%K9%Y=&zLm{~VS8LXGqSuPt;)m*!yAW5mV=_WnHH3m@pt$0+|d4^kB ax`dve%*?1iZP23t0000E(U;|NoB11}qsW+NT#zw^@0qg;9To z*WHOzOja&aalXhkW1Gt6oTFz-G@=;28_|MB_bsoTz3T~%QXD;^!J z2(!PWl93em_#bodwy&E1*A@O}l&E{XHL2)8&+Fv}19^BKJFSfS*_jX@2N-HZ?IMN-=1lm-(cSG`8~tdI!28M W!<{RSCDj9c&fw|l=d#Wzp$Pz6h^VXp delta 595 zcmV-Z0<8Uy1K$LY7k@wq1^@s6s%dfF00001b5ch_0Itp)=>Px%8A(JzRCt{2*S~Aq zKoke?uY(p_HsWb8IABORCR>-R9kcWg$dVy*|AlmD|AovQy7Uj|lA&Aa5Ga8xfe!gW z69~AVLs+WFkg9`p%2|=|*~CN^-_IhSc-Zp2cXv-MSUNn|Nq+~@0RV{Cg$g5x*98Em zFaiMFslNaKo4AjkPFl9Vy-bd6;6OTfwK)U;Jluy6e~7l*LlTc6z5oEkQ&3@K6;~J5 z6QH%-9+LbDAd*~_aNh=13$imQt?+d!SgBpyGxM!_u}?!&p_>SCcKu(i=Ic6SvVGtXB9r zzi*j}**!eiN%ijB_uZmbKR((|VRUkuUe~+tKG&kBUsSONjDi?_-z`3CDo_w#vKBTk zOI@<%vR_55m_+8+~NRzAbCteK_Vc6%s~o6bSSj$O4YH`R==D5k6?8wU+lgHz)JSHL{A|fIpA|fIpA|fIp hA|fIpA|j#{^B-DKcVg0$m7@Rv002ovPDHLkV1oHR9Y6p8