From 5a30e60d31e5287a49999a679d342a4b993123b2 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 18 Mar 2022 19:18:09 +0100 Subject: [PATCH] Added Tooltips that tell players what type of ground they can place vegetation on. --- .../ru/bclib/interfaces/SurvivesOnBlocks.java | 27 ++++++++ .../interfaces/SurvivesOnSpecialGround.java | 65 +++++++++++++++++++ .../ru/bclib/interfaces/SurvivesOnTags.java | 33 ++++++++++ .../ru/bclib/mixin/client/BlockMixin.java | 25 +++++++ .../resources/assets/bclib/lang/de_de.json | 4 +- .../resources/assets/bclib/lang/en_us.json | 4 +- src/main/resources/bclib.mixins.client.json | 3 +- 7 files changed, 158 insertions(+), 3 deletions(-) create mode 100644 src/main/java/ru/bclib/interfaces/SurvivesOnBlocks.java create mode 100644 src/main/java/ru/bclib/interfaces/SurvivesOnSpecialGround.java create mode 100644 src/main/java/ru/bclib/interfaces/SurvivesOnTags.java create mode 100644 src/main/java/ru/bclib/mixin/client/BlockMixin.java diff --git a/src/main/java/ru/bclib/interfaces/SurvivesOnBlocks.java b/src/main/java/ru/bclib/interfaces/SurvivesOnBlocks.java new file mode 100644 index 00000000..b792d22f --- /dev/null +++ b/src/main/java/ru/bclib/interfaces/SurvivesOnBlocks.java @@ -0,0 +1,27 @@ +package ru.bclib.interfaces; + +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.state.BlockState; + +import java.util.List; +import java.util.stream.Collectors; + +public interface SurvivesOnBlocks extends SurvivesOnSpecialGround{ + List getSurvivableBlocks(); + + @Override + default String getSurvivableBlocksString(){ + return getSurvivableBlocks() + .stream() + .filter(block -> block!= Blocks.AIR) + .map(block ->new ItemStack(block).getHoverName().getString()) + .collect(Collectors.joining(", ")); + } + + @Override + default boolean isSurvivable(BlockState state){ + return getSurvivableBlocks().contains(state.getBlock()); + } +} diff --git a/src/main/java/ru/bclib/interfaces/SurvivesOnSpecialGround.java b/src/main/java/ru/bclib/interfaces/SurvivesOnSpecialGround.java new file mode 100644 index 00000000..e2ad9342 --- /dev/null +++ b/src/main/java/ru/bclib/interfaces/SurvivesOnSpecialGround.java @@ -0,0 +1,65 @@ +package ru.bclib.interfaces; + +import com.google.common.collect.Lists; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; + +import java.util.List; + +public interface SurvivesOnSpecialGround { + String getSurvivableBlocksString(); + + @Environment(EnvType.CLIENT) + static List splitLines(String input){ + final int MAX_LEN = 30; + final int MAX_LEN_SECOND = 40; + List lines = Lists.newArrayList(); + int maxLen = MAX_LEN; + + while (input.length()>maxLen){ + int idx = input.lastIndexOf(",", maxLen); + if (idx>=0) { + lines.add( input.substring(0, idx+1).trim()); + input = input.substring(idx+1, input.length()).trim(); + } else { + break; + } + + maxLen = MAX_LEN_SECOND; + } + lines.add(input.trim()); + + return lines; + } + + @Environment(EnvType.CLIENT) + static void appendHoverText(List list, String description) { + final int MAX_LINES = 5; + List lines = splitLines(description); + if (lines.size()>0) { + list.add(new TranslatableComponent("tooltip.bclib.place_on", lines.get(0)).withStyle(ChatFormatting.GREEN)); + } + for (int i=1; i> getSurvivableTags(); + + @Override + default String getSurvivableBlocksString(){ + return getSurvivableTags() + .stream() + .map(tag -> Registry.BLOCK.getTag(tag)) + .filter(named->named.isPresent()) + .map(named->named.get()) + .flatMap(named->named.stream()) + .filter(block -> block != Blocks.AIR && block != null) + .map(block ->new ItemStack(block.value()).getHoverName().getString()) + .collect(Collectors.joining(", ")); + } + + @Override + default boolean isSurvivable(BlockState state){ + return getSurvivableTags().stream().anyMatch(tag->state.is(tag)); + } +} diff --git a/src/main/java/ru/bclib/mixin/client/BlockMixin.java b/src/main/java/ru/bclib/mixin/client/BlockMixin.java new file mode 100644 index 00000000..d4f92437 --- /dev/null +++ b/src/main/java/ru/bclib/mixin/client/BlockMixin.java @@ -0,0 +1,25 @@ +package ru.bclib.mixin.client; + +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import ru.bclib.interfaces.SurvivesOnSpecialGround; + +import java.util.List; + +@Mixin(Block.class) +public class BlockMixin { + @Inject(method="appendHoverText", at=@At("HEAD")) + void bclib_appendSurvivalBlock(ItemStack itemStack, @Nullable BlockGetter blockGetter, List list, TooltipFlag tooltipFlag, CallbackInfo ci){ + if (this instanceof SurvivesOnSpecialGround surv){ + SurvivesOnSpecialGround.appendHoverText(list, surv.getSurvivableBlocksString()); + } + } +} diff --git a/src/main/resources/assets/bclib/lang/de_de.json b/src/main/resources/assets/bclib/lang/de_de.json index bd83c0c9..5038c9bf 100644 --- a/src/main/resources/assets/bclib/lang/de_de.json +++ b/src/main/resources/assets/bclib/lang/de_de.json @@ -52,5 +52,7 @@ "title.bclib.datafixer.error": "Fehler beim Reparieren der Welt", "message.bclib.datafixer.error": "Es gab Fehler beim Reparieren der Welt. Das bedeutet, dass dieser Level wahrscheinlich in einem inkonsistenten Zustand ist und Sie ihn nicht spielen sollten. Bitte stellen Sie Ihr Backup wieder her und beheben Sie die unten aufgeführten Fehler, bevor Sie es erneut versuchen.", "title.bclib.datafixer.error.continue": "Continue and Mark as Fixed", - "title.config.bclib.main.ui.suppressExperimentalDialogOnLoad": "Disable Experimental Warning Screen on Load" + "title.config.bclib.main.ui.suppressExperimentalDialogOnLoad": "Disable Experimental Warning Screen on Load", + + "tooltip.bclib.place_on": "Lebt auf: %s" } \ No newline at end of file diff --git a/src/main/resources/assets/bclib/lang/en_us.json b/src/main/resources/assets/bclib/lang/en_us.json index 4cd68730..977e7f06 100644 --- a/src/main/resources/assets/bclib/lang/en_us.json +++ b/src/main/resources/assets/bclib/lang/en_us.json @@ -54,5 +54,7 @@ "title.bclib.datafixer.error.continue": "Proceed and mark as fixed", "title.config.bclib.client.rendering.customFogRendering": "Custom Fog Rendering", - "title.config.bclib.client.rendering.netherThickFog": "Nether Thick Fog" + "title.config.bclib.client.rendering.netherThickFog": "Nether Thick Fog", + + "tooltip.bclib.place_on": "Survives on: %s" } \ No newline at end of file diff --git a/src/main/resources/bclib.mixins.client.json b/src/main/resources/bclib.mixins.client.json index 0920d0e3..041d5576 100644 --- a/src/main/resources/bclib.mixins.client.json +++ b/src/main/resources/bclib.mixins.client.json @@ -13,7 +13,8 @@ "ModelBakeryMixin", "WorldPresetMixin", "MinecraftMixin", - "GameMixin" + "GameMixin", + "BlockMixin" ], "injectors": { "defaultRequire": 1