9
0
mirror of https://github.com/LeavesMC/Leaves.git synced 2025-12-30 04:19:30 +00:00

Fix fakeplayer break action * 2

This commit is contained in:
violetc
2025-08-16 19:08:14 +08:00
parent f37e9d3783
commit aeb8e07d29
5 changed files with 283 additions and 49 deletions

View File

@@ -0,0 +1,56 @@
package org.leavesmc.leaves.bot;
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.stats.ServerRecipeBook;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.RecipeHolder;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
import java.util.List;
import java.util.function.Predicate;
public class BotRecipeBook extends ServerRecipeBook {
public BotRecipeBook() {
super(($, $1) -> {
});
}
@Override
public void add(@NotNull ResourceKey<Recipe<?>> recipe) {
}
@Override
public void remove(@NotNull ResourceKey<Recipe<?>> recipe) {
}
@Override
public boolean contains(@NotNull ResourceKey<Recipe<?>> recipe) {
return false;
}
@Override
public void removeHighlight(@NotNull ResourceKey<Recipe<?>> recipe) {
}
@Override
public int addRecipes(@NotNull Collection<RecipeHolder<?>> recipes, @NotNull ServerPlayer player) {
return 0;
}
@Override
public int removeRecipes(@NotNull Collection<RecipeHolder<?>> recipes, @NotNull ServerPlayer player) {
return 0;
}
@Override
public void loadUntrusted(@NotNull Packed recipeBook, @NotNull Predicate<ResourceKey<Recipe<?>>> predicate) {
}
@Override
public @NotNull Packed pack() {
return new ServerRecipeBook.Packed(this.bookSettings.copy(), List.of(), List.of());
}
}

View File

@@ -22,6 +22,7 @@ import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerPlayerConnection;
import net.minecraft.stats.ServerStatsCounter;
import net.minecraft.stats.Stat;
import net.minecraft.util.Mth;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
@@ -38,6 +39,7 @@ import net.minecraft.world.entity.projectile.ProjectileUtil;
import net.minecraft.world.entity.vehicle.AbstractBoat;
import net.minecraft.world.inventory.ChestMenu;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.RecipeHolder;
import net.minecraft.world.level.GameRules;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.gameevent.GameEvent;
@@ -71,6 +73,7 @@ import org.leavesmc.leaves.plugin.MinecraftInternalPlugin;
import org.leavesmc.leaves.util.MathUtils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumSet;
import java.util.List;
import java.util.Map;
@@ -110,6 +113,7 @@ public class ServerBot extends ServerPlayer {
this.configs = configBuilder.build();
this.stats = new BotStatsCounter(server);
this.recipeBook = new BotRecipeBook();
this.container = new BotInventoryContainer(this.getInventory());
this.tracingRange = world.spigotConfig.playerTrackingRange * world.spigotConfig.playerTrackingRange;
@@ -514,7 +518,7 @@ public class ServerBot extends ServerPlayer {
}
@Override
public boolean startRiding(Entity vehicle, boolean force) {
public boolean startRiding(@NotNull Entity vehicle, boolean force) {
if (super.startRiding(vehicle, force)) {
if (vehicle instanceof AbstractBoat) {
this.setDeltaMovement(Vec3.ZERO);
@@ -526,6 +530,32 @@ public class ServerBot extends ServerPlayer {
}
}
@Override
public int awardRecipes(@NotNull Collection<RecipeHolder<?>> recipes) {
return 0;
}
@Override
public int resetRecipes(@NotNull Collection<RecipeHolder<?>> recipes) {
return 0;
}
@Override
public void triggerRecipeCrafted(@NotNull RecipeHolder<?> recipe, @NotNull List<ItemStack> items) {
}
@Override
public void awardKillScore(@NotNull Entity entity, @NotNull DamageSource damageSource) {
}
@Override
public void awardStat(@NotNull Stat<?> stat) {
}
@Override
public void resetStat(@NotNull Stat<?> stat) {
}
public void removeTab() {
this.sendPacket(new ClientboundPlayerInfoRemovePacket(List.of(this.getUUID())));
}

View File

@@ -2,7 +2,6 @@ package org.leavesmc.leaves.bot;
import net.kyori.adventure.text.Component;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.level.ServerPlayerGameMode;
import net.minecraft.world.InteractionHand;
@@ -12,6 +11,7 @@ import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.GameType;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.GameMasterBlock;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
@@ -52,36 +52,32 @@ public class ServerBotGameMode extends ServerPlayerGameMode {
@Override
public boolean destroyBlock(@NotNull BlockPos pos) {
BlockState iblockdata = this.level.getBlockState(pos);
BlockEntity tileentity = this.level.getBlockEntity(pos);
Block block = iblockdata.getBlock();
if (this.player.blockActionRestricted(this.level, pos, this.getGameModeForPlayer())) {
BlockState blockState = this.level.getBlockState(pos);
if (!this.player.getMainHandItem().canDestroyBlock(blockState, this.level, pos, this.player)) {
return false;
} else {
this.level.captureDrops = null;
BlockState iblockdata1 = org.leavesmc.leaves.command.subcommands.BlockUpdateCommand.isNoBlockUpdate() ? iblockdata : block.playerWillDestroy(this.level, pos, iblockdata, this.player); // Leaves - no block update
boolean flag = this.level.removeBlock(pos, false);
BlockEntity blockEntity = this.level.getBlockEntity(pos);
Block block = blockState.getBlock();
if (block instanceof GameMasterBlock) {
this.level.sendBlockUpdated(pos, blockState, blockState, 3);
return false;
} else {
BlockState blockState1 = org.leavesmc.leaves.command.subcommands.BlockUpdateCommand.isNoBlockUpdate() ? blockState : block.playerWillDestroy(this.level, pos, blockState, this.player); // Leaves - no block update
boolean flag = this.level.removeBlock(pos, false);
if (flag) {
block.destroy(this.level, pos, blockState1);
}
if (flag) {
block.destroy(this.level, pos, iblockdata1);
ItemStack mainHandItem = this.player.getMainHandItem();
ItemStack itemStack = mainHandItem.copy();
boolean hasCorrectToolForDrops = this.player.hasCorrectToolForDrops(blockState1);
mainHandItem.getItem().mineBlock(mainHandItem, this.level, blockState1, pos, this.player);
if (flag && hasCorrectToolForDrops) {
block.playerDestroy(this.level, this.player, pos, blockState1, blockEntity, itemStack, true, true);
}
return true;
}
ItemStack itemstack = this.player.getMainHandItem();
ItemStack itemstack1 = itemstack.copy();
boolean flag1 = this.player.hasCorrectToolForDrops(iblockdata1);
itemstack.mineBlock(this.level, iblockdata1, pos, this.player);
if (flag && flag1) {
Block.dropResources(iblockdata1, this.level, pos, tileentity, this.player, itemstack1, true);
}
if (flag) {
iblockdata.getBlock().popExperience(this.level, pos, block.getExpDrop(iblockdata, this.level, pos, itemstack, true), this.player);
}
return true;
}
}

View File

@@ -2,7 +2,11 @@ package org.leavesmc.leaves.bot.agent.actions;
import net.minecraft.core.BlockPos;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.enchantment.EnchantmentHelper;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
import org.bukkit.block.Block;
import org.bukkit.craftbukkit.block.CraftBlock;
import org.jetbrains.annotations.NotNull;
@@ -15,6 +19,7 @@ public class ServerBreakBlockAction extends ServerTimerBotAction<ServerBreakBloc
super("break", ServerBreakBlockAction::new);
}
private ItemStack lastItem = null;
private BlockPos lastPos = null;
private int destroyProgressTime = 0;
private int lastSentState = -1;
@@ -25,39 +30,61 @@ public class ServerBreakBlockAction extends ServerTimerBotAction<ServerBreakBloc
if (block != null) {
BlockPos pos = ((CraftBlock) block).getPosition();
if (lastPos == null || !lastPos.equals(pos)) {
BlockState iblockdata = bot.level().getBlockState(pos);
if (lastPos == null || !lastPos.equals(pos) || lastItem == null || !lastItem.equals(bot.getMainHandItem())) {
if (lastPos != null && destroyProgressTime > 0) {
bot.level().destroyBlockProgress(bot.getId(), lastPos, -1);
}
lastItem = bot.getMainHandItem();
lastPos = pos;
destroyProgressTime = 0;
lastSentState = -1;
}
BlockState iblockdata = bot.level().getBlockState(pos);
if (!iblockdata.isAir()) {
bot.swing(InteractionHand.MAIN_HAND);
if (iblockdata.getDestroyProgress(bot, bot.level(), pos) >= 1.0F) {
bot.gameMode.destroyAndAck(pos, 0, "insta mine");
bot.level().destroyBlockProgress(bot.getId(), pos, -1);
bot.updateItemInHand(InteractionHand.MAIN_HAND);
finalBreak();
return true;
if (!iblockdata.isAir()) {
bot.swing(InteractionHand.MAIN_HAND);
EnchantmentHelper.onHitBlock(
bot.level(), bot.getMainHandItem(), bot, bot, EquipmentSlot.MAINHAND, Vec3.atCenterOf(pos), iblockdata,
item -> bot.onEquippedItemBroken(item, EquipmentSlot.MAINHAND)
);
iblockdata.attack(bot.level(), pos, bot);
float f = iblockdata.getDestroyProgress(bot, bot.level(), pos);
if (f >= 1.0F) {
bot.gameMode.destroyAndAck(pos, 0, "insta mine");
bot.updateItemInHand(InteractionHand.MAIN_HAND);
finalBreak();
return true;
} else {
destroyProgressTime++;
int k = (int) (f * 10.0F);
bot.level().destroyBlockProgress(bot.getId(), pos, k);
lastSentState = k;
}
}
float damage = this.incrementDestroyProgress(bot, iblockdata, pos);
if (damage >= 1.0F) {
bot.gameMode.destroyAndAck(pos, 0, "destroyed");
bot.level().destroyBlockProgress(bot.getId(), pos, -1);
bot.updateItemInHand(InteractionHand.MAIN_HAND);
finalBreak();
return true;
} else {
if (!iblockdata.isAir()) {
bot.swing(InteractionHand.MAIN_HAND);
float damage = this.incrementDestroyProgress(bot, iblockdata, pos);
if (damage >= 1.0F) {
bot.gameMode.destroyAndAck(pos, 0, "destroyed");
bot.level().destroyBlockProgress(bot.getId(), pos, -1);
bot.updateItemInHand(InteractionHand.MAIN_HAND);
finalBreak();
return true;
}
}
}
} else {
if (lastPos != null) {
bot.level().destroyBlockProgress(bot.getId(), lastPos, -1);
}
finalBreak();
}
return false;
}
private void finalBreak() {
lastPos = null;
lastItem = null;
destroyProgressTime = 0;
lastSentState = -1;
}