Skip to content

Commit

Permalink
Fix previous release not working on Fabric (#806)
Browse files Browse the repository at this point in the history
Forward port of #805
  • Loading branch information
Rakambda authored Feb 9, 2025
1 parent 22909a7 commit 8d293e7
Show file tree
Hide file tree
Showing 26 changed files with 383 additions and 275 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@
* Failures are generally instances of {@link AbortedResult}, where are succeeded attempts are instances of
* {@link BreakTreeResult}.
*/
public sealed interface IBreakAttemptResult permits BreakTreeResult, AbortedResult{
public sealed interface IBreakAttemptResult permits SuccessResult, AbortedResult{
boolean shouldCancel();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package fr.rakambda.fallingtree.common.tree;

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public enum SuccessResult implements IBreakAttemptResult {
CANCEL(true),
DO_NOT_CANCEL(false);

private final boolean cancel;

@Override
public boolean shouldCancel() {
return cancel;
}
}
35 changes: 28 additions & 7 deletions common/src/main/java/fr/rakambda/fallingtree/common/tree/Tree.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
package fr.rakambda.fallingtree.common.tree;

import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import static java.util.Comparator.comparingInt;
import static java.util.Objects.isNull;
import static java.util.stream.Collectors.toSet;
import fr.rakambda.fallingtree.common.wrapper.IBlockPos;
import fr.rakambda.fallingtree.common.wrapper.ILevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.jetbrains.annotations.NotNull;
import java.util.*;
import static java.util.Comparator.comparingInt;
import static java.util.Objects.isNull;
import static java.util.stream.Collectors.toSet;

@RequiredArgsConstructor
public class Tree{
Expand Down Expand Up @@ -68,9 +74,17 @@ public Optional<TreePart> getLastSequencePart(){
}

@NotNull
public Collection<TreePart> getLogs(){
public Optional<TreePart> getLastSequenceLogPart(){
return getParts().stream()
.filter(part -> part.treePartType().isLog())
.max(comparingInt(TreePart::sequence));
}

@NotNull
public Collection<TreePart> getBreakableLogs(){
return getParts().stream()
.filter(part -> part.treePartType() == TreePartType.LOG)
.filter(part -> part.treePartType().isLog())
.filter(part -> part.treePartType().isBreakable())
.collect(toSet());
}

Expand All @@ -87,7 +101,7 @@ public int getLogCount(){

@NotNull
public Optional<IBlockPos> getTopMostLog(){
return getLogs().stream()
return getBreakableLogs().stream()
.map(TreePart::blockPos)
.max(comparingInt(IBlockPos::getY));
}
Expand All @@ -105,4 +119,11 @@ public Collection<TreePart> getWarts(){
.filter(part -> part.treePartType() == TreePartType.NETHER_WART)
.collect(toSet());
}

@NotNull
public Optional<TreePart> getStart(){
return getParts().stream()
.filter(part -> part.treePartType() == TreePartType.LOG_START)
.findFirst();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@
import fr.rakambda.fallingtree.common.tree.breaking.ShiftDownTreeBreakingHandler;
import fr.rakambda.fallingtree.common.tree.builder.TreeTooBigException;
import fr.rakambda.fallingtree.common.utils.CacheSpeed;
import fr.rakambda.fallingtree.common.wrapper.IBlockEntity;
import fr.rakambda.fallingtree.common.wrapper.IBlockPos;
import fr.rakambda.fallingtree.common.wrapper.IBlockState;
import fr.rakambda.fallingtree.common.wrapper.IItemStack;
import fr.rakambda.fallingtree.common.wrapper.ILevel;
import fr.rakambda.fallingtree.common.wrapper.IPlayer;
Expand All @@ -40,15 +42,15 @@ private boolean shouldPreserveTool(@NotNull IPlayer player){
}

@NotNull
public IBreakAttemptResult breakTree(@NotNull ILevel level, @NotNull IPlayer player, @NotNull IBlockPos blockPos){
public IBreakAttemptResult breakTree(boolean isCancellable, @NotNull ILevel level, @NotNull IPlayer player, @NotNull IBlockPos originPos, @NotNull IBlockState originState, @Nullable IBlockEntity originEntity){
if(!level.isServer()){
return AbortedResult.NOT_SERVER;
}
if(!mod.getConfiguration().getTrees().isTreeBreaking()){
return AbortedResult.NOT_ENABLED;
}

if(!mod.checkForceToolUsage(player, level, blockPos)){
if(!mod.checkForceToolUsage(player, level, originPos)){
mod.notifyPlayer(player, mod.translate("chat.fallingtree.force_tool_usage", mod.getConfiguration().getTrees().getMaxScanSize()));
return AbortedResult.REQUIRED_TOOL_ABSENT;
}
Expand All @@ -58,15 +60,14 @@ public IBreakAttemptResult breakTree(@NotNull ILevel level, @NotNull IPlayer pla
}

try{
var treeOptional = mod.getTreeBuilder().getTree(player, level, blockPos);
var treeOptional = mod.getTreeBuilder().getTree(player, level, originPos, originState, originEntity);
if(treeOptional.isEmpty()){
return AbortedResult.NO_SUCH_TREE;
}

var tree = treeOptional.get();
var breakMode = getBreakMode(player.getMainHandItem());
var result = getBreakingHandler(breakMode).breakTree(player, tree);
return new BreakTreeResult(!result, breakMode);
return getBreakingHandler(breakMode).breakTree(isCancellable, player, tree);
}
catch(TreeTooBigException e){
mod.notifyPlayer(player, mod.translate("chat.fallingtree.tree_too_big", mod.getConfiguration().getTrees().getMaxScanSize()));
Expand Down Expand Up @@ -96,7 +97,7 @@ private ITreeBreakingHandler getBreakingHandler(@NotNull BreakMode breakMode){
}

@NotNull
public Optional<Float> getBreakSpeed(@NotNull IPlayer player, @NotNull IBlockPos blockPos, float originalSpeed){
public Optional<Float> getBreakSpeed(@NotNull IPlayer player, @NotNull IBlockPos blockPos, @NotNull IBlockState blockState, float originalSpeed){
if(!mod.getConfiguration().getTrees().isTreeBreaking()){
return Optional.empty();
}
Expand All @@ -109,19 +110,19 @@ public Optional<Float> getBreakSpeed(@NotNull IPlayer player, @NotNull IBlockPos

var cacheSpeed = speedCache.compute(player.getUUID(), (uuid, speed) -> {
if(isNull(speed) || !speed.isValid(blockPos)){
speed = getSpeed(player, blockPos, originalSpeed);
speed = getSpeed(player, blockPos, blockState, originalSpeed);
}
return speed;
});
return Optional.ofNullable(cacheSpeed).map(CacheSpeed::getSpeed);
}

@Nullable
private CacheSpeed getSpeed(@NotNull IPlayer player, @NotNull IBlockPos pos, float originalSpeed){
private CacheSpeed getSpeed(@NotNull IPlayer player, @NotNull IBlockPos pos, @NotNull IBlockState blockState, float originalSpeed){
var speedMultiplicand = mod.getConfiguration().getTools().getSpeedMultiplicand();
try{
return speedMultiplicand <= 0 ? null :
mod.getTreeBuilder().getTree(player, player.getLevel(), pos)
mod.getTreeBuilder().getTree(player, player.getLevel(), pos, blockState, null)
.map(tree -> new CacheSpeed(pos, originalSpeed / ((float) speedMultiplicand * tree.getLogCount())))
.orElse(null);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
package fr.rakambda.fallingtree.common.tree;

import fr.rakambda.fallingtree.common.wrapper.IBlockEntity;
import fr.rakambda.fallingtree.common.wrapper.IBlockPos;
import fr.rakambda.fallingtree.common.wrapper.IBlockState;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public record TreePart(
@NotNull IBlockPos blockPos,
@NotNull TreePartType treePartType,
int sequence
int sequence,
@NotNull IBlockState blockState,
@Nullable IBlockEntity blockEntity
){
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,19 @@
@Getter
@RequiredArgsConstructor
public enum TreePartType{
LEAF(false, true, false),
LEAF_NEED_BREAK(true, true, true),
LOG(true, false, true),
NETHER_WART(true, false, true),
MANGROVE_ROOTS(true, false, true),
OTHER(false, false, false);
LEAF(false, true, false, false),
LEAF_NEED_BREAK(true, true, true, false),
LOG(true, false, true, true),
LOG_START(false, false, true, true),
MANGROVE_ROOTS(true, false, true, false),
NETHER_WART(true, false, true, false),
OTHER(false, false, false, false);

@Getter
private static final TreePartType[] values = values();

private final boolean breakable;
private final boolean edge;
private final boolean includeInTree;
private final boolean log;
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package fr.rakambda.fallingtree.common.tree.breaking;

import fr.rakambda.fallingtree.common.FallingTreeCommon;
import fr.rakambda.fallingtree.common.tree.IBreakAttemptResult;
import fr.rakambda.fallingtree.common.tree.SuccessResult;
import fr.rakambda.fallingtree.common.tree.Tree;
import fr.rakambda.fallingtree.common.wrapper.IBlockPos;
import fr.rakambda.fallingtree.common.wrapper.ILevel;
Expand All @@ -24,7 +26,8 @@ public class FallingAnimationTreeBreakingHandler implements ITreeBreakingHandler
private final LeafForceBreaker leafForceBreaker;

@Override
public boolean breakTree(@NotNull IPlayer player, @NotNull Tree tree) throws BreakTreeTooBigException{
@NotNull
public IBreakAttemptResult breakTree(boolean isCancellable, @NotNull IPlayer player, @NotNull Tree tree) throws BreakTreeTooBigException{
var tool = player.getMainHandItem();
var level = tree.getLevel();
var toolHandler = new ToolDamageHandler(tool,
Expand All @@ -36,9 +39,9 @@ public boolean breakTree(@NotNull IPlayer player, @NotNull Tree tree) throws Bre
mod.getConfiguration().getTools().getDamageRounding());

if(toolHandler.isPreserveTool()){
log.debug("Didn't break tree at {} as {}'s tool was about to break", tree.getHitPos(), player);
log.info("Didn't break tree at {} as {}'s tool was about to break", tree.getHitPos(), player);
mod.notifyPlayer(player, mod.translate("chat.fallingtree.prevented_break_tool"));
return false;
return SuccessResult.DO_NOT_CANCEL;
}

var scannedLeaves = new LinkedList<IBlockPos>();
Expand Down Expand Up @@ -84,7 +87,10 @@ public boolean breakTree(@NotNull IPlayer player, @NotNull Tree tree) throws Bre
if(brokenCount >= wantToBreakCount){
leafForceBreaker.forceBreakDecayLeaves(player, tree, level);
}
return true;
if(player.isCreative() && mod.getConfiguration().isLootInCreative()){
tree.getStart().ifPresent(part -> part.blockState().getBlock().playerDestroy(level, player, tree.getHitPos(), part.blockState(), part.blockEntity(), tool));
}
return SuccessResult.DO_NOT_CANCEL;
}

private void fallLeaf(LinkedList<IBlockPos> scannedLeaves, @NotNull IPlayer player, @NotNull ILevel level, int distance, @NotNull IBlockPos blockPos){
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package fr.rakambda.fallingtree.common.tree.breaking;

import fr.rakambda.fallingtree.common.tree.IBreakAttemptResult;
import fr.rakambda.fallingtree.common.tree.Tree;
import fr.rakambda.fallingtree.common.wrapper.IPlayer;
import org.jetbrains.annotations.NotNull;

public interface ITreeBreakingHandler{
boolean breakTree(@NotNull IPlayer player, @NotNull Tree tree) throws BreakTreeTooBigException;
@NotNull
IBreakAttemptResult breakTree(boolean isCancellable, @NotNull IPlayer player, @NotNull Tree tree) throws BreakTreeTooBigException;
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package fr.rakambda.fallingtree.common.tree.breaking;

import fr.rakambda.fallingtree.common.FallingTreeCommon;
import fr.rakambda.fallingtree.common.tree.IBreakAttemptResult;
import fr.rakambda.fallingtree.common.tree.SuccessResult;
import fr.rakambda.fallingtree.common.tree.Tree;
import fr.rakambda.fallingtree.common.tree.TreePart;
import fr.rakambda.fallingtree.common.wrapper.IPlayer;
Expand All @@ -18,7 +20,8 @@ public class InstantaneousTreeBreakingHandler implements ITreeBreakingHandler{
private final LeafForceBreaker leafForceBreaker;

@Override
public boolean breakTree(@NotNull IPlayer player, @NotNull Tree tree) throws BreakTreeTooBigException{
@NotNull
public IBreakAttemptResult breakTree(boolean isCancellable, @NotNull IPlayer player, @NotNull Tree tree) throws BreakTreeTooBigException{
var tool = player.getMainHandItem();
var level = tree.getLevel();
var toolHandler = new ToolDamageHandler(tool,
Expand All @@ -30,9 +33,9 @@ public boolean breakTree(@NotNull IPlayer player, @NotNull Tree tree) throws Bre
mod.getConfiguration().getTools().getDamageRounding());

if(toolHandler.isPreserveTool()){
log.debug("Didn't break tree at {} as {}'s tool was about to break", tree.getHitPos(), player);
log.info("Didn't break tree at {} as {}'s tool was about to break", tree.getHitPos(), player);
mod.notifyPlayer(player, mod.translate("chat.fallingtree.prevented_break_tool"));
return false;
return SuccessResult.DO_NOT_CANCEL;
}

var wantToBreakCount = Math.min(tree.getBreakableCount(), toolHandler.getMaxBreakCount());
Expand Down Expand Up @@ -71,7 +74,10 @@ public boolean breakTree(@NotNull IPlayer player, @NotNull Tree tree) throws Bre
if(brokenCount >= wantToBreakCount){
leafForceBreaker.forceBreakDecayLeaves(player, tree, level);
}
return true;
if(player.isCreative() && mod.getConfiguration().isLootInCreative()){
tree.getStart().ifPresent(part -> part.blockState().getBlock().playerDestroy(level, player, tree.getHitPos(), part.blockState(), part.blockEntity(), tool));
}
return SuccessResult.DO_NOT_CANCEL;
}

@NotNull
Expand Down
Loading

0 comments on commit 8d293e7

Please sign in to comment.