Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix previous release not working on Fabric #805

Merged
merged 1 commit into from
Feb 9, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

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;
}
}
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
Loading