Skip to content

Commit

Permalink
Functional hammer and better configs
Browse files Browse the repository at this point in the history
  • Loading branch information
Vazkii committed Oct 2, 2023
1 parent 10a0fdc commit 258568d
Show file tree
Hide file tree
Showing 7 changed files with 142 additions and 99 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package vazkii.quark.content.experimental.item;

import javax.annotation.Nonnull;

import net.minecraft.core.BlockPos;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import vazkii.quark.base.item.QuarkItem;
import vazkii.quark.base.module.QuarkModule;
import vazkii.quark.content.experimental.module.VariantSelectorModule;
import vazkii.quark.content.tweaks.module.LockRotationModule;

public class HammerItem extends QuarkItem {

public HammerItem(QuarkModule module) {
super("hammer", module, new Item.Properties()
.stacksTo(1)
.tab(CreativeModeTab.TAB_TOOLS));
}

@Nonnull
@Override
public InteractionResult useOn(UseOnContext context) {
Player player = context.getPlayer();
Level level = context.getLevel();
BlockPos pos = context.getClickedPos();
BlockState state = level.getBlockState(pos);
Block block = state.getBlock();

String variant = VariantSelectorModule.getSavedVariant(player);
Block variantBlock = VariantSelectorModule.getVariantOrOriginal(block, variant);
if(variantBlock != null) {
BlockPlaceContext bpc = new BlockPlaceContext(context);
BlockState place = variantBlock.getStateForPlacement(bpc);
place = LockRotationModule.fixBlockRotation(place, bpc);

if(!place.equals(state)) {
level.removeBlock(pos, false);
level.setBlock(pos, place, 1 | 2);
player.swing(context.getHand());

level.playSound(null, pos, variantBlock.getSoundType(place).getPlaceSound(), SoundSource.BLOCKS, 1.0F, 1.0F);
}

return InteractionResult.SUCCESS;
}

return InteractionResult.PASS;
}

}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,22 @@
import com.mojang.blaze3d.platform.Window;

import net.minecraft.client.Minecraft;
import net.minecraft.core.BlockPos;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.client.event.RenderGuiOverlayEvent;
Expand All @@ -32,6 +36,7 @@
import vazkii.quark.base.network.QuarkNetwork;
import vazkii.quark.base.network.message.experimental.PlaceVariantChangedMessage;
import vazkii.quark.content.experimental.config.BlockSuffixConfig;
import vazkii.quark.content.experimental.item.HammerItem;

@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")
Expand All @@ -41,21 +46,31 @@ public class VariantSelectorModule extends QuarkModule {

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 public static boolean removeVariantRecipes = true; // TODO: impl
@Config public static boolean convertVariantItems = true; // TODO: impl already existing
@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
public static BlockSuffixConfig variants = new BlockSuffixConfig(
Arrays.asList("slab", "stairs", "wall", "fence", "vertical_slab"),
Arrays.asList("quark"));

public static Item hammer;

@Override
public void configChanged() {
staticEnabled = enabled;
}

private static String getSavedVariant(Player player) {
@Override
public void register() {
hammer = new HammerItem(this).setCondition(() -> enableHammer);
}

public static String getSavedVariant(Player player) {
if(player.level.isClientSide)
return clientVariant;

Expand Down Expand Up @@ -83,14 +98,23 @@ private static Block getMainHandVariantBlock(Player player, String variant) {
return null;
}

private static Block getVariantForBlock(Block block, String variant) {
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);
}

@OnlyIn(Dist.CLIENT)
public static void setClientVariant(String variant) {
clientVariant = variant;
Expand Down Expand Up @@ -157,17 +181,35 @@ public void onRender(RenderGuiOverlayEvent.Pre event) {
String savedVariant = getSavedVariant(player);

if(savedVariant != null && !savedVariant.isEmpty()) {
Block variantBlock = getMainHandVariantBlock(player, savedVariant);
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;

Window window = event.getWindow();
int x = window.getGuiScaledWidth() / 2;
int y = window.getGuiScaledHeight() / 2 + 12;
int pad = 8;

ItemStack mainHand = player.getMainHandItem();
ItemStack displayLeft = mainHand.copy();

displayLeft.setCount(1);

mc.font.draw(event.getPoseStack(), "->", x - 5, y + 5, 0xFFFFFF);
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/assets/quark/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -569,6 +569,7 @@
"item.quark.ancient_chest_boat": "Ancient Boat with Chest",
"item.quark.ancient_fruit": "Ancient Fruit",
"item.quark.pathfinders_quill": "Pathfinder's Quill",
"item.quark.hammer": "Hammer",

"item.minecraft.potion.effect.quark.resilience": "Potion of Stability",
"item.minecraft.splash_potion.effect.quark.resilience": "Splash Potion of Stability",
Expand Down
6 changes: 6 additions & 0 deletions src/main/resources/assets/quark/models/item/hammer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"parent": "item/handheld",
"textures": {
"layer0": "quark:item/hammer"
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
25 changes: 25 additions & 0 deletions src/main/resources/data/quark/recipes/experimental/trowel.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"III",
"ISI",
" S "
],
"key": {
"S": {
"tag": "forge:rods/wooden"
},
"I": {
"tag": "forge:ingots/iron"
}
},
"result": {
"item": "quark:hammer"
},
"conditions": [
{
"type": "quark:flag",
"flag": "hammer"
}
]
}

0 comments on commit 258568d

Please sign in to comment.