Skip to content

Commit

Permalink
Sc/cherrypick tools (#691)
Browse files Browse the repository at this point in the history
* Revamp tools (#688)

* aa why u crash

* aa why u crash

* holy shit this is worse than I thought...

* god this is annoying to do
megacommit moment

* update muh codes

* it runs.

* feat: megacommit moment
- adds all classes for custom tools
- fabric parity for forge extension methods, minus extra weird ones
- custom behaviours
- et cetera, contains lots of skill issues

* fix: use better, not as hardcoded AOE behaviour

* fix: behaviours now use UseOnContext instead of a lot of parameters

* fix: ShapedEnergyTransferRecipe crashes REI because .matches() is never called

* fix: fill creative tabs & recipes with correctly-NBT'd items

* fix: some more AOE fixes

* fix: better valid drop tier handling

* fix: misc fixes

* feat: tooltips

* fix: move tintColor to IGTTool

* fix: make tool types use correct constructors

* feat: allow autofilling recipes with items that have different NBT

* fix: spades now exist.

* fix: mining tool tags.

* chore: datagen & some minor touchups
CURRENT ISSUES:
- torch place behavior voids your tool.
- fabric doesn't have the capabilities attaching yet.

* feat: remake how tool types are passed to IToolable etc. and how IToolable is called.

* fix: better tool break handling when entity == null

* fix: plunger now voids fluids.

* fix: hoe behaviour works.

* "fix": disable torch place behavior for initial release as I can't figure out a fix.

* fix: log strip behaviour quirks

* feat: custom wrench block rotating actions

* fix: rail rotating with crowbar only works with normal rails

* feat: forge overrides for all tool actions that have them, onBlockStartBreak for fabric

* fix: tree felling might've worked with any tool

* fix: bad nullability everywhere

* fix: scythe had the wrong tool class, GTHoeItem extends ShovelItem instead of HoeItem

* fix: plunger only voids 1/81 on fabric

* fix: make constructors protected for tool classes

* feat: make GTItems.TOOL_ITEMS be a table of <Material, Type, IGTTool> instead of a <Tier, Type, ToolItem>

* fix: fix up tint colors in preparation for 2-color tool textures

* feat: fallback to vanilla logic in case someone calls IGTToolImpl.definition$isCorrectToolForDrops with a non-GT tool

* fix: plunger recipes set the max durability of the tool when crafting

* fix: update jade plugin to use new tool item map

* fix: oops.

* fix: for some reason NBTToJsonConverter always converts numbers to doubles which ends up in larger numbers having rounding errors.

* feat: colored tool handles

* fix: reorder tint indexes on tool models

* Revert "fix: reorder tint indexes on tool models"

This reverts commit fa2cbdf.

* fix: this is a better way to do the same thing.

* feat: implement getDefaultInstance on all tool type classes

* remove now useless mixin, add nbt output to fabric because it seemed to be missing.

* Revert "fix: for some reason NBTToJsonConverter always converts numbers to doubles which ends up in larger numbers having rounding errors."

This reverts commit 7140db5.

* fix: heading comma in tool class tooltip

* fix: fabric now has the ability to have electric tools

* chore: changelog & version

* chore: datagen

* emphasize tool breakage

Co-authored-by: Mikerooni <[email protected]>

* fix weird import

Co-authored-by: Mikerooni <[email protected]>

* Update common/src/main/java/com/gregtechceu/gtceu/api/item/tool/aoe/AoESymmetrical.java

Co-authored-by: Mikerooni <[email protected]>

---------

Co-authored-by: Mikerooni <[email protected]>

* fix errors

---------

Co-authored-by: Mikerooni <[email protected]>
  • Loading branch information
screret and mikerooni authored Jan 5, 2024
1 parent 3c77b52 commit c244d07
Show file tree
Hide file tree
Showing 205 changed files with 8,208 additions and 1,195 deletions.
20 changes: 18 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,21 @@
# ChangeLog

Version: 1.0.19.b
Version: 1.0.20

- fix output hatches not being recognized
- revamps tools, bringing parity with 1.12 (except electric tools)
- adds spades, an AOE shovel
- adds functionality to most tools that were missing it previously
- colored crowbars
- fixes some tools' block break times etc.
- brings parity with forge & fabric on some tool-related functionality
- fixes some issues with crafting tools
- AOE tools now work in creative mode
- wrenches now rotate blocks other than GT machines
- crowbars now rotate rail blocks
- plungers made from different rubbers now have different durabilities

***WARNING: THIS BREAKS MOST EXISTING TOOLS!***

Notes for addon devs:
- GTItems.TOOL_ITEMS is now a table<Material, Type, Tool item> instead of the old <Tier, Type, Item>
- torch placing with pickaxes is currently disabled as none of us can find a fix for it deleting the tool.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import com.gregtechceu.gtceu.api.data.RotationState;
import com.gregtechceu.gtceu.api.item.MetaMachineItem;
import com.gregtechceu.gtceu.api.item.tool.GTToolType;
import com.gregtechceu.gtceu.api.item.tool.ToolHelper;
import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity;
import com.gregtechceu.gtceu.api.machine.MachineDefinition;
import com.gregtechceu.gtceu.api.machine.MetaMachine;
Expand All @@ -14,6 +16,7 @@
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.RandomSource;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
Expand All @@ -23,6 +26,7 @@
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
Expand All @@ -42,6 +46,7 @@

import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
import java.util.Set;

/**
* @author KilaBash
Expand Down Expand Up @@ -232,10 +237,24 @@ public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState
}
}


@Override
public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
var machine = getMachine(world, pos);
ItemStack itemStack = player.getItemInHand(hand);

Set<GTToolType> types = ToolHelper.getToolTypes(itemStack);
if (machine != null && !types.isEmpty() && ToolHelper.canUse(itemStack)) {
var result = machine.onToolClick(types, itemStack, new UseOnContext(player, hand, hit));
if (result.getSecond() == InteractionResult.CONSUME && player instanceof ServerPlayer serverPlayer) {
ToolHelper.playToolSound(result.getFirst(), serverPlayer);

if (!serverPlayer.isCreative()) {
ToolHelper.damageItem(itemStack, serverPlayer, 1);
}
}
if (result.getSecond() != InteractionResult.PASS) return result.getSecond();
}

if (machine instanceof IInteractedMachine interactedMachine) {
var result = interactedMachine.onUse(state, world, pos, player, hand, hit);
if (result != InteractionResult.PASS) return result;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity;
import com.gregtechceu.gtceu.api.capability.ICoverable;
import com.gregtechceu.gtceu.api.capability.IToolable;
import com.gregtechceu.gtceu.api.item.PipeBlockItem;
import com.gregtechceu.gtceu.api.item.tool.GTToolType;
import com.gregtechceu.gtceu.api.item.tool.ToolHelper;
import com.gregtechceu.gtceu.api.pipenet.IAttachData;
import com.gregtechceu.gtceu.api.pipenet.IPipeNode;
import com.gregtechceu.gtceu.api.pipenet.IPipeType;
Expand All @@ -18,10 +20,14 @@
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
Expand All @@ -35,6 +41,7 @@
import net.minecraft.world.level.storage.loot.LootContext;
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets;
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.EntityCollisionContext;
import net.minecraft.world.phys.shapes.Shapes;
Expand All @@ -43,6 +50,7 @@

import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
import java.util.Set;

/**
* @author KilaBash
Expand Down Expand Up @@ -180,6 +188,26 @@ public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState
}
}

@Override
public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
ItemStack itemStack = player.getItemInHand(hand);
BlockEntity entity = level.getBlockEntity(pos);

Set<GTToolType> types = ToolHelper.getToolTypes(itemStack);
if (entity instanceof IToolable toolable && !types.isEmpty() && ToolHelper.canUse(itemStack)) {
var result = toolable.onToolClick(types, itemStack, new UseOnContext(player, hand, hit));
if (result.getSecond() == InteractionResult.CONSUME && player instanceof ServerPlayer serverPlayer) {
ToolHelper.playToolSound(result.getFirst(), serverPlayer);

if (!serverPlayer.isCreative()) {
ToolHelper.damageItem(itemStack, serverPlayer, 1);
}
}
return result.getSecond();
}
return InteractionResult.PASS;
}

@Override
public boolean isCollisionShapeFullBlock(BlockState state, BlockGetter level, BlockPos pos) {
return false;
Expand All @@ -197,7 +225,7 @@ public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos,
if (context instanceof EntityCollisionContext entityCtx && entityCtx.getEntity() instanceof Player player) {
var coverable = pipeNode.getCoverContainer();
var held = player.getMainHandItem();
if (held.is(GTToolType.WIRE_CUTTER.itemTag) || held.is(GTToolType.WRENCH.itemTag) ||
if (GTToolType.WIRE_CUTTER.itemTags.stream().anyMatch(held::is) || GTToolType.WRENCH.itemTags.stream().anyMatch(held::is) ||
CoverPlaceBehavior.isCoverBehaviorItem(held, coverable::hasAnyCover, coverDef -> ICoverable.canPlaceCover(coverDef, coverable)) ||
(held.getItem() instanceof BlockItem blockItem && blockItem.getBlock() instanceof PipeBlock<?,?,?> pipeBlock && pipeBlock.pipeType.type().equals(pipeType.type()))) {
return Shapes.or(Shapes.block(), shape);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;

import java.util.Set;

/**
* @author KilaBash
* @date 2023/2/17
Expand Down Expand Up @@ -77,12 +79,12 @@ public void clearRemoved() {
}

@Override
public boolean shouldRenderGrid(Player player, ItemStack held, GTToolType toolType) {
return metaMachine.shouldRenderGrid(player, held, toolType);
public boolean shouldRenderGrid(Player player, ItemStack held, Set<GTToolType> toolTypes) {
return metaMachine.shouldRenderGrid(player, held, toolTypes);
}

@Override
public ResourceTexture sideTips(Player player, GTToolType toolType, Direction side) {
return metaMachine.sideTips(player, toolType, side);
public ResourceTexture sideTips(Player player, Set<GTToolType> toolTypes, Direction side) {
return metaMachine.sideTips(player, toolTypes, side);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import com.lowdragmc.lowdraglib.syncdata.blockentity.IAsyncAutoSyncBlockEntity;
import com.lowdragmc.lowdraglib.syncdata.blockentity.IAutoPersistBlockEntity;
import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder;
import com.mojang.datafixers.util.Pair;
import lombok.Getter;
import lombok.Setter;
import net.minecraft.MethodsReturnNonnullByDefault;
Expand All @@ -42,12 +43,12 @@
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import org.jetbrains.annotations.NotNull;

import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
* @author KilaBash
Expand Down Expand Up @@ -228,10 +229,10 @@ public int getVisualConnections() {
//******* Interaction *******//
//////////////////////////////////////
@Override
public boolean shouldRenderGrid(Player player, ItemStack held, GTToolType toolType) {
if (canToolTunePipe(toolType) || toolType == GTToolType.SCREWDRIVER) return true;
public boolean shouldRenderGrid(Player player, ItemStack held, Set<GTToolType> toolTypes) {
if (toolTypes.contains(getPipeTuneTool()) || toolTypes.contains(GTToolType.SCREWDRIVER)) return true;
for (CoverBehavior cover : coverContainer.getCovers()) {
if (cover.shouldRenderGrid(player, held, toolType)) return true;
if (cover.shouldRenderGrid(player, held, toolTypes)) return true;
}
return false;
}
Expand All @@ -241,22 +242,22 @@ public ResourceTexture getPipeTexture(boolean isBlock) {
}

@Override
public ResourceTexture sideTips(Player player, GTToolType toolType, Direction side) {
if (canToolTunePipe(toolType)) {
public ResourceTexture sideTips(Player player, Set<GTToolType> toolTypes, Direction side) {
if (toolTypes.contains(getPipeTuneTool())) {
return getPipeTexture(isBlocked(side));
}
var cover = coverContainer.getCoverAtSide(side);
if (cover != null) {
return cover.sideTips(player, toolType, side);
return cover.sideTips(player, toolTypes, side);
}
return null;
}

@Override
public InteractionResult onToolClick(@NotNull GTToolType toolType, ItemStack itemStack, UseOnContext context) {
public Pair<GTToolType, InteractionResult> onToolClick(Set<GTToolType> toolTypes, ItemStack itemStack, UseOnContext context) {
// the side hit from the machine grid
var playerIn = context.getPlayer();
if (playerIn == null) return InteractionResult.PASS;
if (playerIn == null) return Pair.of(null, InteractionResult.PASS);

var hand = context.getHand();
var hitResult = new BlockHitResult(context.getClickLocation(), context.getClickedFace(), context.getClickedPos(), false);
Expand All @@ -265,15 +266,15 @@ public InteractionResult onToolClick(@NotNull GTToolType toolType, ItemStack ite
if (gridSide == null) gridSide = hitResult.getDirection();

// Prioritize covers where they apply (Screwdriver, Soft Mallet)
if (toolType == GTToolType.SCREWDRIVER) {
if (toolTypes.contains(GTToolType.SCREWDRIVER)) {
if (coverBehavior != null) {
return coverBehavior.onScrewdriverClick(playerIn, hand, hitResult);
return Pair.of(GTToolType.SCREWDRIVER, coverBehavior.onScrewdriverClick(playerIn, hand, hitResult));
}
} else if (toolType == GTToolType.SOFT_MALLET) {
} else if (toolTypes.contains(GTToolType.SOFT_MALLET)) {
if (coverBehavior != null) {
return coverBehavior.onSoftMalletClick(playerIn, hand, hitResult);
return Pair.of(GTToolType.SOFT_MALLET, coverBehavior.onSoftMalletClick(playerIn, hand, hitResult));
}
} else if (canToolTunePipe(toolType)) {
} else if (toolTypes.contains(getPipeTuneTool())) {
setBlocked(gridSide, !isBlocked(gridSide));
// try to connect to the next node.
if (!isBlocked(gridSide)) {
Expand All @@ -282,21 +283,21 @@ public InteractionResult onToolClick(@NotNull GTToolType toolType, ItemStack ite
node.setBlocked(gridSide.getOpposite(), false);
}
}
return InteractionResult.CONSUME;
} else if (toolType == GTToolType.CROWBAR) {
return Pair.of(getPipeTuneTool(), InteractionResult.CONSUME);
} else if (toolTypes.contains(GTToolType.CROWBAR)) {
if (coverBehavior != null) {
if (!isRemote()) {
getCoverContainer().removeCover(gridSide, playerIn);
}
return InteractionResult.CONSUME;
return Pair.of(GTToolType.CROWBAR, InteractionResult.CONSUME);
}
}

return InteractionResult.PASS;
return Pair.of(null, InteractionResult.PASS);
}

protected boolean canToolTunePipe(GTToolType toolType) {
return toolType == GTToolType.WRENCH;
protected GTToolType getPipeTuneTool() {
return GTToolType.WRENCH;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.gregtechceu.gtceu.api.gui.GuiTextures;
import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfigurator;
import com.gregtechceu.gtceu.api.gui.widget.CoverContainerConfigurator;
import com.gregtechceu.gtceu.api.item.tool.ToolHelper;
import com.gregtechceu.gtceu.utils.GTUtil;
import com.lowdragmc.lowdraglib.LDLib;
import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture;
Expand Down Expand Up @@ -94,7 +95,7 @@ default boolean placeCoverOnSide(Direction side, ItemStack itemStack, CoverDefin
markDirty();
scheduleNeighborShapeUpdate();
// TODO achievement
// AdvancementTriggers.FIRST_COVER_PLACE.trigger((EntityPlayerMP) player);
// AdvancementTriggers.FIRST_COVER_PLACE.trigger((PlayerMP) player);
return true;
}

Expand Down Expand Up @@ -197,7 +198,7 @@ static boolean doesCoverCollide(Direction side, List<VoxelShape> collisionBox, d

@Nullable
static Direction rayTraceCoverableSide(ICoverable coverable, Player player) {
var rayTrace = RayTraceHelper.rayTraceRange(coverable.getLevel(), player, 5);
var rayTrace = RayTraceHelper.rayTraceRange(coverable.getLevel(), player, ToolHelper.getPlayerBlockReach(player));
if (rayTrace.getType() == HitResult.Type.MISS) {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package com.gregtechceu.gtceu.api.capability;

import com.gregtechceu.gtceu.api.item.tool.GTToolType;
import com.mojang.datafixers.util.Pair;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.UseOnContext;
import org.jetbrains.annotations.Nullable;

import javax.annotation.Nonnull;
import java.util.Set;

/**
* @author KilaBash
Expand All @@ -19,6 +22,6 @@ public interface IToolable {
*
* @return SUCCESS / CONSUME (will damage tool) / FAIL if something happened, so tools will get damaged and animations will be played
*/
InteractionResult onToolClick(@Nonnull GTToolType toolType, ItemStack itemStack, UseOnContext context);
Pair<@Nullable GTToolType, InteractionResult> onToolClick(@Nonnull Set<GTToolType> toolTypes, ItemStack itemStack, UseOnContext context);

}
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
* Represents cover instance attached on the specific side of meta tile entity
Expand Down Expand Up @@ -178,16 +179,16 @@ public ICoverRenderer getCoverRenderer() {
}

@Override
public boolean shouldRenderGrid(Player player, ItemStack held, GTToolType toolType) {
return toolType == GTToolType.CROWBAR || (toolType == GTToolType.SCREWDRIVER && this instanceof IUICover);
public boolean shouldRenderGrid(Player player, ItemStack held, Set<GTToolType> toolTypes) {
return toolTypes.contains(GTToolType.CROWBAR) || (toolTypes.contains(GTToolType.SCREWDRIVER ) && this instanceof IUICover);
}

@Override
public ResourceTexture sideTips(Player player, GTToolType toolType, Direction side) {
if (toolType == GTToolType.CROWBAR) {
public ResourceTexture sideTips(Player player, Set<GTToolType> toolTypes, Direction side) {
if (toolTypes.contains(GTToolType.CROWBAR)) {
return GuiTextures.TOOL_REMOVE_COVER;
}
if (toolType == GTToolType.SCREWDRIVER && this instanceof IUICover) {
if (toolTypes.contains(GTToolType.SCREWDRIVER) && this instanceof IUICover) {
return GuiTextures.TOOL_COVER_SETTINGS;
}
return null;
Expand Down
Loading

0 comments on commit c244d07

Please sign in to comment.