Skip to content

Commit

Permalink
close #4357
Browse files Browse the repository at this point in the history
  • Loading branch information
yrsegal committed Oct 2, 2023
1 parent 8ea6ebf commit c1d2bb8
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 52 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
package vazkii.quark.content.experimental.module;

import java.util.Arrays;

import org.lwjgl.glfw.GLFW;

import com.mojang.blaze3d.platform.Window;

import net.minecraft.client.KeyMapping;
import net.minecraft.client.Minecraft;
import net.minecraft.core.BlockPos;
Expand All @@ -29,6 +24,7 @@
import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay;
import net.minecraftforge.event.entity.EntityJoinLevelEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import org.lwjgl.glfw.GLFW;
import vazkii.quark.base.Quark;
import vazkii.quark.base.client.handler.ModKeybindHandler;
import vazkii.quark.base.module.LoadModule;
Expand All @@ -39,41 +35,43 @@
import vazkii.quark.content.experimental.config.BlockSuffixConfig;
import vazkii.quark.content.experimental.item.HammerItem;

import java.util.Arrays;

@LoadModule(category = ModuleCategory.EXPERIMENTAL, hasSubscriptions = true, enabledByDefault = false,
description = "Allows placing variant blocks automatically via a selector menu, can also disable all variant block recipes and items")
public class VariantSelectorModule extends QuarkModule {

private static final String TAG_CURRENT_VARIANT = Quark.MOD_ID + ":CurrentSelectedVariant";

private static String clientVariant = "";
private static boolean staticEnabled;

@Config(description = "Set this to true to automatically convert any dropped variant items into their originals. Do this ONLY if you intend to take control of every recipe via a data pack or equivalent, as this will introduce dupes otherwise.")
public static boolean convertVariantItems = false;

@Config(flag = "hammer", description = "Enable the hammer, allowing variants to be swapped between eachother, including the original block. Do this ONLY under the same circumstances as Convert Variant Items.")
public static boolean enableHammer = false;

@Config
@Config
public static BlockSuffixConfig variants = new BlockSuffixConfig(
Arrays.asList("slab", "stairs", "wall", "fence", "vertical_slab"),
Arrays.asList("slab", "stairs", "wall", "fence", "vertical_slab"),
Arrays.asList("quark"));

public static Item hammer;

@OnlyIn(Dist.CLIENT)
private static KeyMapping variantSelectorKey;

@Override
public void register() {
hammer = new HammerItem(this).setCondition(() -> enableHammer);
}

@Override
public void registerKeybinds(RegisterKeyMappingsEvent event) {
variantSelectorKey = ModKeybindHandler.init(event, "variant_selector", "r", ModKeybindHandler.MISC_GROUP);
}

@Override
public void configChanged() {
staticEnabled = enabled;
Expand All @@ -82,58 +80,58 @@ public void configChanged() {
public static String getSavedVariant(Player player) {
if(player.level.isClientSide)
return clientVariant;

return player.getPersistentData().getString(TAG_CURRENT_VARIANT);
}

// TODO on login player should lose variant
public static void setSavedVariant(ServerPlayer player, String variant) {
if(variant == null)
variant = "";

if(variant.isEmpty() || variants.knownSuffixes.contains(variant))
player.getPersistentData().putString(TAG_CURRENT_VARIANT, variant);
}

@OnlyIn(Dist.CLIENT)
public static void setClientVariant(String variant) {
clientVariant = variant;
}

private static Block getMainHandVariantBlock(Player player, String variant) {
ItemStack mainHand = player.getMainHandItem();
if(mainHand.getItem() instanceof BlockItem blockItem) {
Block block = blockItem.getBlock();
return getVariantForBlock(block, variant);
}

return null;
}

public static Block getVariantForBlock(Block block, String variant) {
Block variantBlock = variants.getBlockForVariant(block, variant);
if(variantBlock != null)
return variantBlock;

return null;
}

public static Block getVariantOrOriginal(Block block, String variant) {
block = variants.getOriginalBlock(block);

if(variant == null || variant.isEmpty())
return variants.getOriginalBlock(block);

return getVariantForBlock(block, variant);
}

@SubscribeEvent
@OnlyIn(Dist.CLIENT)
public void keystroke(Key event) {
Minecraft mc = Minecraft.getInstance();
if(mc.level != null && event.getAction() == GLFW.GLFW_PRESS) {
if(variantSelectorKey.isDown()) {

ItemStack stack = mc.player.getMainHandItem();
if(stack.is(hammer)) {
HitResult result = mc.hitResult;
Expand All @@ -143,15 +141,15 @@ public void keystroke(Key event) {
stack = new ItemStack(variants.getOriginalBlock(block));
}
}

if(!stack.isEmpty() && stack.getItem() instanceof BlockItem)
mc.setScreen(new VariantSelectorScreen(stack, variantSelectorKey, clientVariant, variants.knownSuffixes));

return;
}
}
}

@SubscribeEvent
public void addEntityToWorld(EntityJoinLevelEvent event) {
Entity entity = event.getEntity();
Expand All @@ -160,21 +158,21 @@ public void addEntityToWorld(EntityJoinLevelEvent event) {
if(stack.getItem() instanceof BlockItem bi) {
Block block = bi.getBlock();
Block otherBlock = variants.getOriginalBlock(block);

if(otherBlock != block) {
ItemStack clone = new ItemStack(otherBlock.asItem());
clone.setTag(stack.getTag());
ie.setItem(clone);
}
}

}
}

public static BlockState modifyBlockPlacementState(BlockState state, BlockPlaceContext ctx) {
if(!staticEnabled || state == null)
return state;

Player player = ctx.getPlayer();
if(player != null) {
String variant = getSavedVariant(player);
Expand All @@ -183,42 +181,42 @@ public static BlockState modifyBlockPlacementState(BlockState state, BlockPlaceC
return target.getStateForPlacement(ctx);
}
}

return state;
}

@SubscribeEvent
@OnlyIn(Dist.CLIENT)
public void onRender(RenderGuiOverlayEvent.Pre event) {
Minecraft mc = Minecraft.getInstance();
if(event.getOverlay() != VanillaGuiOverlay.CROSSHAIR.type() || mc.screen instanceof VariantSelectorScreen)
return;

Player player = mc.player;
String savedVariant = getSavedVariant(player);

if(savedVariant != null) {
ItemStack mainHand = player.getMainHandItem();
ItemStack displayLeft = mainHand.copy();

Block variantBlock = null;

if(displayLeft.is(hammer)) {
HitResult result = mc.hitResult;
if(result instanceof BlockHitResult bhr) {
BlockPos pos = bhr.getBlockPos();
Block testBlock = player.level.getBlockState(pos).getBlock();

displayLeft = new ItemStack(testBlock);
variantBlock = getVariantOrOriginal(testBlock, savedVariant);
}
}
else
variantBlock = getMainHandVariantBlock(player, savedVariant);

if(variantBlock != null) {
ItemStack displayRight = new ItemStack(variantBlock);

if(displayLeft.getItem() == displayRight.getItem())
return;

Expand All @@ -228,12 +226,12 @@ public void onRender(RenderGuiOverlayEvent.Pre event) {
int pad = 8;

displayLeft.setCount(1);

mc.font.draw(event.getPoseStack(), "->", x - 5, y + 5, 0xFFFFFF);
mc.getItemRenderer().renderAndDecorateItem(displayLeft, (int) x - 16 - pad, (int) y);
mc.getItemRenderer().renderAndDecorateItem(displayRight, (int) x + pad, (int) y);
mc.getItemRenderer().renderAndDecorateItem(displayLeft, x - 16 - pad, y);
mc.getItemRenderer().renderAndDecorateItem(displayRight, x + pad, y);
}
}
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,12 @@ public static void renderItemForMessage(PoseStack poseStack, FormattedCharSequen

StringBuilder before = new StringBuilder();

int halfSpace = mc.font.width(" ") / 2;

sequence.accept((counter_, style, character) -> {
String sofar = before.toString();
if (sofar.endsWith(" ")) {
render(mc, poseStack, sofar.substring(0, sofar.length() - 3), x, y, style, color);
if (sofar.endsWith(" ")) {
render(mc, poseStack, sofar.substring(0, sofar.length() - 2), character == ' ' ? 0 : -halfSpace, x, y, style, color);
return false;
}
before.append((char) character);
Expand Down Expand Up @@ -174,7 +176,7 @@ public static MutableComponent createStackComponent(ItemStack stack, MutableComp
}

@OnlyIn(Dist.CLIENT)
private static void render(Minecraft mc, PoseStack pose, String before, float x, float y, Style style, int color) {
private static void render(Minecraft mc, PoseStack pose, String before, float extraShift, float x, float y, Style style, int color) {
float a = (color >> 24 & 255) / 255.0F;

HoverEvent hoverEvent = style.getHoverEvent();
Expand All @@ -186,7 +188,7 @@ private static void render(Minecraft mc, PoseStack pose, String before, float x,
if (stack.isEmpty())
stack = new ItemStack(Blocks.BARRIER); // for invalid icon

int shift = mc.font.width(before);
float shift = mc.font.width(before) + extraShift;

if (a > 0) {
alphaValue = a;
Expand Down

0 comments on commit c1d2bb8

Please sign in to comment.