From a2485163fbfaa3782cd6ffcd04905236c65cc7b7 Mon Sep 17 00:00:00 2001 From: KnightMiner Date: Fri, 26 Jul 2019 00:24:07 -0500 Subject: [PATCH] Add custom portal colors --- .../inspirations/common/Config.java | 3 + .../inspirations/library/Util.java | 12 +++ .../tweaks/TweaksClientProxy.java | 16 +++- .../tweaks/client/PortalColorHandler.java | 87 ++++++++++++++++++ .../resources/META-INF/inspirations_at.cfg | 5 +- .../inspirations/blockstates/portal.json | 6 ++ .../inspirations/models/block/portal_ew.json | 15 +++ .../inspirations/models/block/portal_ns.json | 15 +++ .../inspirations/textures/blocks/portal.png | Bin 0 -> 24687 bytes .../textures/blocks/portal.png.mcmeta | 3 + 10 files changed, 158 insertions(+), 4 deletions(-) create mode 100644 src/main/java/knightminer/inspirations/tweaks/client/PortalColorHandler.java create mode 100644 src/main/resources/assets/inspirations/blockstates/portal.json create mode 100644 src/main/resources/assets/inspirations/models/block/portal_ew.json create mode 100644 src/main/resources/assets/inspirations/models/block/portal_ns.json create mode 100644 src/main/resources/assets/inspirations/textures/blocks/portal.png create mode 100644 src/main/resources/assets/inspirations/textures/blocks/portal.png.mcmeta diff --git a/src/main/java/knightminer/inspirations/common/Config.java b/src/main/java/knightminer/inspirations/common/Config.java index 3d57f3bb..fc9e45e5 100644 --- a/src/main/java/knightminer/inspirations/common/Config.java +++ b/src/main/java/knightminer/inspirations/common/Config.java @@ -246,6 +246,7 @@ public class Config { public static short milkCooldownTime = 600; public static boolean caveSpiderDrops = true; public static boolean skeletonSkull = true; + public static boolean customPortalColor = true; // heartbeet public static boolean enableHeartbeet = true; public static boolean brewHeartbeet = true; @@ -527,6 +528,8 @@ public static void preInit(FMLPreInitializationEvent event) { milkCooldown = configFile.getBoolean("milkCooldown", "tweaks", milkCooldown, "Adds a cooldown to milking cows, prevents practically infinite milk in modded worlds where milk is more useful."); milkCooldownTime = (short)configFile.getInt("time", "tweaks.milkCooldown", milkCooldownTime, 1, Short.MAX_VALUE, "Delay in seconds after milking a cow before it can be milked again."); + // custom portal color + customPortalColor = configFile.getBoolean("customPortalColor", "tweaks", customPortalColor, "Allows the portal color to be changed by placing colored blocks under the portal. Any block that tints a beacon beam will work for the color."); } // compatibility diff --git a/src/main/java/knightminer/inspirations/library/Util.java b/src/main/java/knightminer/inspirations/library/Util.java index c859b702..d4dc9763 100644 --- a/src/main/java/knightminer/inspirations/library/Util.java +++ b/src/main/java/knightminer/inspirations/library/Util.java @@ -22,6 +22,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.Arrays; import java.util.List; @@ -157,6 +158,17 @@ public static float[] getColorComponents(int color) { return new float[] {i / 255.0f, j / 255.0f, k / 255.0f}; } + /** + * Splits a hex color integer into three float color components between 0 and 1 + * @param component float color component array, must be length 3 + * @return Color integer value + */ + public static int getColorInteger(@Nonnull float[] component) { + return ((int)(component[0] * 255) & 0xFF) << 16 + | ((int)(component[1] * 255) & 0xFF) << 8 + | ((int)(component[2] * 255) & 0xFF); + } + /** * Adds the tooltips for the potion type into the given string list * @param potionType Potion type input diff --git a/src/main/java/knightminer/inspirations/tweaks/TweaksClientProxy.java b/src/main/java/knightminer/inspirations/tweaks/TweaksClientProxy.java index 0e86321e..38feaa1a 100644 --- a/src/main/java/knightminer/inspirations/tweaks/TweaksClientProxy.java +++ b/src/main/java/knightminer/inspirations/tweaks/TweaksClientProxy.java @@ -1,18 +1,17 @@ package knightminer.inspirations.tweaks; -import java.util.LinkedHashMap; - import com.google.common.collect.Maps; - import knightminer.inspirations.common.ClientProxy; import knightminer.inspirations.common.Config; import knightminer.inspirations.common.PulseBase; import knightminer.inspirations.library.Util; import knightminer.inspirations.library.client.ClientUtil; +import knightminer.inspirations.library.client.NameStateMapper; import knightminer.inspirations.library.client.PropertyStateMapper; import knightminer.inspirations.recipes.RecipesClientProxy; import knightminer.inspirations.tweaks.block.BlockBetterFlowerPot; import knightminer.inspirations.tweaks.block.BlockFittedCarpet; +import knightminer.inspirations.tweaks.client.PortalColorHandler; import net.minecraft.block.BlockCarpet; import net.minecraft.block.properties.IProperty; import net.minecraft.block.state.IBlockState; @@ -37,12 +36,15 @@ import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import java.util.LinkedHashMap; + public class TweaksClientProxy extends ClientProxy { private static final ResourceLocation CARPET_MODEL = Util.getResource("carpet"); private static final ResourceLocation CAULDRON_ITEM_MODEL = Util.getResource("cauldron_item"); private static final ResourceLocation ENCHANTED_BOOK = Util.getResource("enchanted_book"); private static final ResourceLocation FIREWORKS = Util.getResource("fireworks"); + private static final ResourceLocation PORTAL = Util.getResource("portal"); private static final ModelResourceLocation FLOWER_POT_MODEL = new ModelResourceLocation(Util.getResource("flower_pot"), "normal"); @SubscribeEvent @@ -52,6 +54,9 @@ public void registerModels(ModelRegistryEvent event) { BlockFittedCarpet.NORTHWEST, BlockFittedCarpet.NORTHEAST, BlockFittedCarpet.SOUTHWEST, BlockFittedCarpet.SOUTHEAST )); setModelStateMapper(InspirationsTweaks.flowerPot, new FlowerPotStateMapper()); + if (Config.customPortalColor) { + setModelStateMapper(Blocks.PORTAL, new NameStateMapper(PORTAL)); + } registerItemModel(InspirationsTweaks.cactusSeeds); registerItemModel(InspirationsTweaks.carrotSeeds); @@ -94,6 +99,11 @@ public void registerBlockColors(ColorHandlerEvent.Block event) { }, Blocks.FLOWER_POT); } + // portal tinting + if (Config.customPortalColor) { + registerBlockColors(colors, new PortalColorHandler(), Blocks.PORTAL); + } + // coloring on sugar cane crop to match reeds registerBlockColors(colors, (state, world, pos, index) -> { if(world == null || pos == null) { diff --git a/src/main/java/knightminer/inspirations/tweaks/client/PortalColorHandler.java b/src/main/java/knightminer/inspirations/tweaks/client/PortalColorHandler.java new file mode 100644 index 00000000..42e99611 --- /dev/null +++ b/src/main/java/knightminer/inspirations/tweaks/client/PortalColorHandler.java @@ -0,0 +1,87 @@ +package knightminer.inspirations.tweaks.client; + +import knightminer.inspirations.Inspirations; +import knightminer.inspirations.library.Util; +import net.minecraft.block.Block; +import net.minecraft.block.BlockStainedGlass; +import net.minecraft.block.BlockStainedGlassPane; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.color.IBlockColor; +import net.minecraft.init.Blocks; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ChunkCache; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import javax.annotation.Nullable; +import java.util.HashSet; +import java.util.Set; + +/** + * Logic to handle getting the color for a portal from stained glass below + */ +public class PortalColorHandler implements IBlockColor { + private static final int DEFAULT_COLOR = 0x9928FF; + private static final Set BEACON_COLOR_BLACKLIST = new HashSet<>(); + + @Override + public int colorMultiplier(IBlockState state, @Nullable IBlockAccess world, @Nullable BlockPos pos, int tintIndex) { + if (world == null || pos == null) { + return DEFAULT_COLOR; + } + + // iterate down until the first non-portal block + // can skip every other block as it takes at least 2 from a portal to below a portal + pos = pos.down(2); + IBlockState colorState = world.getBlockState(pos); + Block block = colorState.getBlock(); + while(block == Blocks.PORTAL || block == Blocks.OBSIDIAN) { + // update iterator + pos = pos.down(block == Blocks.PORTAL ? 2 : 1); + colorState = world.getBlockState(pos); + block = colorState.getBlock(); + } + + return getColorValue(world, pos); + } + + /** + * Gets the color for a block in the world, uses the same logic as beacon beam colors + * @param access Block access + * @param pos Block pos + * @return + */ + private static int getColorValue(IBlockAccess access, BlockPos pos) { + IBlockState state = access.getBlockState(pos); + Block block = state.getBlock(); + // stained glass + if (block == Blocks.STAINED_GLASS) { + return state.getValue(BlockStainedGlass.COLOR).colorValue; + } + if (block == Blocks.STAINED_GLASS_PANE) { + return state.getValue(BlockStainedGlassPane.COLOR).colorValue; + } + // beacon color fallback + if (!BEACON_COLOR_BLACKLIST.contains(block)) { + World world = null; + if (access instanceof World) { + world = (World)access; + } else if (access instanceof ChunkCache) { + world = ((ChunkCache)access).world; + } + if (world != null) { + try { + float[] color = block.getBeaconColorMultiplier(state, world, pos, pos); + if (color != null && color.length == 3) { + return Util.getColorInteger(color); + } + } catch (ClassCastException e) { + Inspirations.log.error("Error getting beacon color for block", e); + BEACON_COLOR_BLACKLIST.add(block); + } + } + } + + return DEFAULT_COLOR; + } +} diff --git a/src/main/resources/META-INF/inspirations_at.cfg b/src/main/resources/META-INF/inspirations_at.cfg index 834033b6..ce273ed1 100644 --- a/src/main/resources/META-INF/inspirations_at.cfg +++ b/src/main/resources/META-INF/inspirations_at.cfg @@ -10,4 +10,7 @@ public net.minecraft.item.EnumDyeColor field_193351_w # colorValue public net.minecraft.tileentity.TileEntityBeacon field_146015_k # isComplete # Sheild enchantments -public net.minecraft.entity.EntityLivingBase func_184583_d(Lnet/minecraft/util/DamageSource;)Z # canBlockDamageSource \ No newline at end of file +public net.minecraft.entity.EntityLivingBase func_184583_d(Lnet/minecraft/util/DamageSource;)Z # canBlockDamageSource + +# Portal color +public net.minecraft.world.ChunkCache field_72815_e # world \ No newline at end of file diff --git a/src/main/resources/assets/inspirations/blockstates/portal.json b/src/main/resources/assets/inspirations/blockstates/portal.json new file mode 100644 index 00000000..b2f9d0f6 --- /dev/null +++ b/src/main/resources/assets/inspirations/blockstates/portal.json @@ -0,0 +1,6 @@ +{ + "variants": { + "axis=z": { "model": "inspirations:portal_ew" }, + "axis=x": { "model": "inspirations:portal_ns" } + } +} diff --git a/src/main/resources/assets/inspirations/models/block/portal_ew.json b/src/main/resources/assets/inspirations/models/block/portal_ew.json new file mode 100644 index 00000000..cf8e558d --- /dev/null +++ b/src/main/resources/assets/inspirations/models/block/portal_ew.json @@ -0,0 +1,15 @@ +{ + "textures": { + "particle": "blocks/portal", + "portal": "inspirations:blocks/portal" + }, + "elements": [ + { "from": [ 6, 0, 0 ], + "to": [ 10, 16, 16 ], + "faces": { + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#portal", "tintindex": 0 }, + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#portal", "tintindex": 0 } + } + } + ] +} diff --git a/src/main/resources/assets/inspirations/models/block/portal_ns.json b/src/main/resources/assets/inspirations/models/block/portal_ns.json new file mode 100644 index 00000000..20f55ef6 --- /dev/null +++ b/src/main/resources/assets/inspirations/models/block/portal_ns.json @@ -0,0 +1,15 @@ +{ + "textures": { + "particle": "blocks/portal", + "portal": "inspirations:blocks/portal" + }, + "elements": [ + { "from": [ 0, 0, 6 ], + "to": [ 16, 16, 10 ], + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#portal", "tintindex": 0 }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#portal", "tintindex": 0 } + } + } + ] +} diff --git a/src/main/resources/assets/inspirations/textures/blocks/portal.png b/src/main/resources/assets/inspirations/textures/blocks/portal.png new file mode 100644 index 0000000000000000000000000000000000000000..495916235a84c13cf30dfc34a39b3c0cc3358337 GIT binary patch literal 24687 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