From 55c314f6dc4e598f6241f1bddaba563f699dc5a2 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sat, 25 Feb 2023 03:59:24 +0100 Subject: [PATCH] The full spectrum - Water wheel material lookup supports any reasonably implemented wood type - Water wheel items use spruce - Cleanup mtls --- .../waterwheel/WaterWheelBlockEntity.java | 4 ++ .../waterwheel/WaterWheelRenderer.java | 52 +++++++++++++++---- .../waterwheel/WaterWheelStructuralBlock.java | 11 ++++ .../block/crushing_wheel/crushing_wheel.mtl | 35 ------------- .../models/block/large_water_wheel/item.json | 5 ++ .../large_water_wheel/waterwheel_large.mtl | 42 --------------- 6 files changed, 61 insertions(+), 88 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlockEntity.java index d127275bd..c4b326028 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlockEntity.java @@ -26,6 +26,7 @@ import net.minecraft.util.Mth; import net.minecraft.world.InteractionResult; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.BubbleColumnBlock; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -89,8 +90,11 @@ public class WaterWheelBlockEntity extends GeneratingKineticBlockEntity { return InteractionResult.PASS; if (!material.is(BlockTags.PLANKS)) return InteractionResult.PASS; + if (level.isClientSide()) + return InteractionResult.SUCCESS; this.material = material; notifyUpdate(); + level.levelEvent(2001, worldPosition, Block.getId(material)); return InteractionResult.SUCCESS; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelRenderer.java index f241dce25..eecdec4c3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelRenderer.java @@ -1,7 +1,9 @@ package com.simibubi.create.content.contraptions.components.waterwheel; +import java.util.List; import java.util.Map; -import java.util.function.Function; +import java.util.Optional; +import java.util.Random; import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.core.StitchedSprite; @@ -18,16 +20,18 @@ import com.simibubi.create.foundation.utility.RegisteredObjects; import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; -import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.Direction; import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.core.Holder; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.registries.ForgeRegistries; public class WaterWheelRenderer extends KineticBlockEntityRenderer { public static final Compartment WATER_WHEEL = new Compartment<>(); @@ -91,25 +95,51 @@ public class WaterWheelRenderer extends Kinetic boolean extension = key.state().getOptionalValue(LargeWaterWheelBlock.EXTENSION).orElse(false); BakedModel template = getTemplateModel(key.large(), extension).get(); - // TODO waterwheels: improve sprite selection - BlockState material = key.material(); - Block block = material.getBlock(); - ResourceLocation id = RegisteredObjects.getKeyOrThrow(block); + BlockState planksBlockState = key.material(); + Block planksBlock = planksBlockState.getBlock(); + ResourceLocation id = RegisteredObjects.getKeyOrThrow(planksBlock); String path = id.getPath(); if (path.endsWith("_planks")) { String namespace = id.getNamespace(); String wood = path.substring(0, path.length() - 7); - Function spriteFunc = Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS); - + BlockState logBlockState = getLogBlockState(namespace, wood); + Map map = new Reference2ReferenceOpenHashMap<>(); - map.put(OAK_PLANKS_TEMPLATE.get(), spriteFunc.apply(new ResourceLocation(namespace, "block/" + wood + "_planks"))); - map.put(OAK_LOG_TEMPLATE.get(), spriteFunc.apply(new ResourceLocation(namespace, "block/" + wood + "_log"))); - map.put(OAK_LOG_TOP_TEMPLATE.get(), spriteFunc.apply(new ResourceLocation(namespace, "block/" + wood + "_log_top"))); + map.put(OAK_PLANKS_TEMPLATE.get(), getSpriteOnSide(planksBlockState, Direction.UP)); + map.put(OAK_LOG_TEMPLATE.get(), getSpriteOnSide(logBlockState, Direction.NORTH)); + map.put(OAK_LOG_TOP_TEMPLATE.get(), getSpriteOnSide(logBlockState, Direction.UP)); return BakedModelHelper.generateModel(template, map::get); } return BakedModelHelper.generateModel(template, sprite -> null); } + + private static BlockState getLogBlockState(String namespace, String wood) { + for (String suffix : new String[] { "_log", "_stem" }) { + Optional state = + ForgeRegistries.BLOCKS.getHolder(new ResourceLocation(namespace, wood + suffix)) + .map(Holder::value) + .map(Block::defaultBlockState); + if (state.isPresent()) + return state.get(); + } + return Blocks.OAK_LOG.defaultBlockState(); + } + + private static TextureAtlasSprite getSpriteOnSide(BlockState blockstate, Direction side) { + BakedModel blockModel = Minecraft.getInstance() + .getBlockRenderer() + .getBlockModel(blockstate); + if (blockModel == null) + return null; + @SuppressWarnings("deprecation") + List quads = blockModel.getQuads(blockstate, side, new Random()); + if (quads.isEmpty()) + return null; + return quads.get(0) + .getSprite(); + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelStructuralBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelStructuralBlock.java index f4ef8be4c..a3eb33cd1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelStructuralBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelStructuralBlock.java @@ -17,6 +17,7 @@ import net.minecraft.client.particle.ParticleEngine; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -85,6 +86,16 @@ public class WaterWheelStructuralBlock extends DirectionalBlock implements IWren return IWrenchable.super.onSneakWrenched(state, context); } + @Override + public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, + BlockHitResult pHit) { + if (!stillValid(pLevel, pPos, pState, false)) + return InteractionResult.FAIL; + if (!(pLevel.getBlockEntity(getMaster(pLevel, pPos, pState))instanceof WaterWheelBlockEntity wwt)) + return InteractionResult.FAIL; + return wwt.applyMaterialIfValid(pPlayer.getItemInHand(pHand)); + } + @Override public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { if (stillValid(pLevel, pPos, pState, false)) diff --git a/src/main/resources/assets/create/models/block/crushing_wheel/crushing_wheel.mtl b/src/main/resources/assets/create/models/block/crushing_wheel/crushing_wheel.mtl index f48060048..f1ca0bbc9 100644 --- a/src/main/resources/assets/create/models/block/crushing_wheel/crushing_wheel.mtl +++ b/src/main/resources/assets/create/models/block/crushing_wheel/crushing_wheel.mtl @@ -2,51 +2,16 @@ # www.blender.org newmtl crushing_wheel_insert -Ns 250.000000 -Ka 1.000000 1.000000 1.000000 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.450000 -d 1.000000 -illum 2 map_Kd #insert newmtl crushing_wheel_plates -Ns 250.000000 -Ka 1.000000 1.000000 1.000000 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.450000 -d 1.000000 -illum 2 map_Kd #plates newmtl m_axis -Ns 0.000000 -Ka 1.000000 1.000000 1.000000 -Ks 0.000000 0.000000 0.000000 -Ke 0.000000 0.000000 0.000000 -Ni 1.450000 -d 1.000000 -illum 1 map_Kd #axis newmtl m_axis_top -Ns 0.000000 -Ka 1.000000 1.000000 1.000000 -Ks 0.000000 0.000000 0.000000 -Ke 0.000000 0.000000 0.000000 -Ni 1.450000 -d 1.000000 -illum 1 map_Kd #axis_top newmtl m_spruce_log_top.001 -Ns 0.000000 -Ka 1.000000 1.000000 1.000000 -Ks 0.000000 0.000000 0.000000 -Ke 0.000000 0.000000 0.000000 -Ni 1.450000 -d 1.000000 -illum 1 map_Kd #spruce_log_top diff --git a/src/main/resources/assets/create/models/block/large_water_wheel/item.json b/src/main/resources/assets/create/models/block/large_water_wheel/item.json index 83fd3e909..e50aa0d70 100644 --- a/src/main/resources/assets/create/models/block/large_water_wheel/item.json +++ b/src/main/resources/assets/create/models/block/large_water_wheel/item.json @@ -3,6 +3,11 @@ "loader": "forge:obj", "flip-v": true, "model": "create:models/block/large_water_wheel/waterwheel_large.obj", + "textures": { + "log": "block/spruce_log", + "planks": "block/spruce_planks", + "log_top": "block/spruce_log_top" + }, "display": { "gui": { "rotation": [ 30, 225, 0 ], diff --git a/src/main/resources/assets/create/models/block/large_water_wheel/waterwheel_large.mtl b/src/main/resources/assets/create/models/block/large_water_wheel/waterwheel_large.mtl index 3812591d3..06dd89d77 100644 --- a/src/main/resources/assets/create/models/block/large_water_wheel/waterwheel_large.mtl +++ b/src/main/resources/assets/create/models/block/large_water_wheel/waterwheel_large.mtl @@ -2,61 +2,19 @@ # www.blender.org newmtl axis -Ns 0.000000 -Ka 1.000000 1.000000 1.000000 -Ks 0.000000 0.000000 0.000000 -Ke 0.000000 0.000000 0.000000 -Ni 1.450000 -d 1.000000 -illum 1 map_Kd #axis newmtl axis_top -Ns 0.000000 -Ka 1.000000 1.000000 1.000000 -Ks 0.000000 0.000000 0.000000 -Ke 0.000000 0.000000 0.000000 -Ni 1.450000 -d 1.000000 -illum 1 map_Kd #axis_top newmtl waterwheel_log -Ns 250.000000 -Ka 1.000000 1.000000 1.000000 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.450000 -d 1.000000 -illum 2 map_Kd #log newmtl waterwheel_metal -Ns 250.000000 -Ka 1.000000 1.000000 1.000000 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.450000 -d 1.000000 -illum 2 map_Kd #metal newmtl waterwheel_plank -Ns 250.000000 -Ka 1.000000 1.000000 1.000000 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.450000 -d 1.000000 -illum 2 map_Kd #planks newmtl waterwheel_stripped_log -Ns 250.000000 -Ka 1.000000 1.000000 1.000000 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.450000 -d 1.000000 -illum 2 map_Kd #log_top