mirror of
https://github.com/BlazingGames/blazing-games-plugin.git
synced 2025-02-03 21:26:41 -05:00
commit
78961b0cac
4 changed files with 123 additions and 34 deletions
|
@ -23,16 +23,26 @@ import de.blazemcworld.blazinggames.enchantments.sys.CustomEnchantments;
|
|||
import de.blazemcworld.blazinggames.enchantments.sys.EnchantmentHelper;
|
||||
import de.blazemcworld.blazinggames.items.recipes.RecipeHelper;
|
||||
import de.blazemcworld.blazinggames.teleportanchor.LodestoneStorage;
|
||||
import de.blazemcworld.blazinggames.utils.Drops;
|
||||
import de.blazemcworld.blazinggames.utils.InventoryUtils;
|
||||
import de.blazemcworld.blazinggames.utils.ItemUtils;
|
||||
import de.blazemcworld.blazinggames.utils.Pair;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Effect;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.*;
|
||||
import org.bukkit.block.data.Waterlogged;
|
||||
import org.bukkit.block.data.type.Leaves;
|
||||
import org.bukkit.craftbukkit.CraftWorld;
|
||||
import org.bukkit.craftbukkit.block.CraftBlock;
|
||||
import org.bukkit.craftbukkit.entity.CraftPlayer;
|
||||
import org.bukkit.craftbukkit.inventory.CraftItemStack;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.entity.ExperienceOrb;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
|
@ -57,7 +67,8 @@ public class BreakBlockEventListener implements Listener {
|
|||
Material.SPRUCE_LOG,
|
||||
Material.CHERRY_LOG,
|
||||
Material.WARPED_STEM,
|
||||
Material.CRIMSON_STEM
|
||||
Material.CRIMSON_STEM,
|
||||
Material.PALE_OAK_LOG
|
||||
);
|
||||
|
||||
private final Set<Material> leaves = Set.of(
|
||||
|
@ -72,7 +83,8 @@ public class BreakBlockEventListener implements Listener {
|
|||
Material.AZALEA_LEAVES,
|
||||
Material.FLOWERING_AZALEA_LEAVES,
|
||||
Material.WARPED_WART_BLOCK,
|
||||
Material.NETHER_WART_BLOCK
|
||||
Material.NETHER_WART_BLOCK,
|
||||
Material.PALE_OAK_LEAVES
|
||||
);
|
||||
|
||||
|
||||
|
@ -95,11 +107,7 @@ public class BreakBlockEventListener implements Listener {
|
|||
}
|
||||
}
|
||||
|
||||
Collection<ItemStack> drops = getBlockDrops(player, event.getBlock());
|
||||
|
||||
onAnyBlockBreak(event.getBlock());
|
||||
|
||||
InventoryUtils.collectableDrop(player, event.getBlock().getLocation(), drops);
|
||||
fakeBreakBlock(player, event.getBlock(), false);
|
||||
|
||||
if (EnchantmentHelper.hasActiveCustomEnchantment(mainHand, CustomEnchantments.TREE_FELLER)) {
|
||||
if (logs.contains(event.getBlock().getType())) {
|
||||
|
@ -219,15 +227,17 @@ public class BreakBlockEventListener implements Listener {
|
|||
Bukkit.getScheduler().runTaskLater(BlazingGames.get(), () -> treeFeller(player, blocksToBreak), 1);
|
||||
}
|
||||
|
||||
public static Collection<ItemStack> getBlockDrops(Player player, Block block) {
|
||||
public static Drops getBlockDrops(Player player, Block block) {
|
||||
ItemStack mainHand = player.getInventory().getItemInMainHand();
|
||||
|
||||
return getBlockDrops(mainHand, block);
|
||||
}
|
||||
|
||||
public static Collection<ItemStack> getBlockDrops(ItemStack mainHand, Block block) {
|
||||
public static Drops getBlockDrops(ItemStack mainHand, Block block) {
|
||||
BlockState state = block.getState();
|
||||
Collection<ItemStack> drops = block.getDrops(mainHand);
|
||||
Drops drops = new Drops(block.getDrops(mainHand));
|
||||
|
||||
drops.addExperience(getDroppedExp(block, mainHand));
|
||||
|
||||
if (block.getType() == Material.CHISELED_BOOKSHELF) {
|
||||
if (mainHand.getEnchantmentLevel(Enchantment.SILK_TOUCH) <= 0) {
|
||||
|
@ -244,6 +254,7 @@ public class BreakBlockEventListener implements Listener {
|
|||
mainHand.getType() == Material.DIAMOND_PICKAXE ||
|
||||
mainHand.getType() == Material.NETHERITE_PICKAXE
|
||||
)) {
|
||||
drops.setExperience(0);
|
||||
CreatureSpawner spawner = (CreatureSpawner) block.getState();
|
||||
ItemStack item = new ItemStack(Material.SPAWNER);
|
||||
BlockStateMeta meta = (BlockStateMeta) item.getItemMeta();
|
||||
|
@ -297,22 +308,26 @@ public class BreakBlockEventListener implements Listener {
|
|||
|
||||
if (ComputerRegistry.getComputerByLocationRounded(block.getLocation()) != null) {
|
||||
BootedComputer computer = ComputerRegistry.getComputerByLocationRounded(block.getLocation());
|
||||
return List.of(ComputerRegistry.addAttributes(computer.getType().getType().getDisplayItem(computer), computer));
|
||||
return new Drops(ComputerRegistry.addAttributes(computer.getType().getType().getDisplayItem(computer), computer));
|
||||
} else {
|
||||
return drops;
|
||||
}
|
||||
}
|
||||
|
||||
public static void fakeBreakBlock(Player player, Block block) {
|
||||
fakeBreakBlock(player, block, true);
|
||||
}
|
||||
|
||||
public static void fakeBreakBlock(Player player, Block block, boolean playEffects) {
|
||||
if (block.isEmpty() || block.getType().getHardness() < 0 || block.isLiquid()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Collection<ItemStack> drops = getBlockDrops(player, block);
|
||||
Drops drops = getBlockDrops(player, block);
|
||||
|
||||
onAnyBlockBreak(block);
|
||||
|
||||
block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getBlockData());
|
||||
if(playEffects) block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getBlockData());
|
||||
|
||||
boolean waterlogged = false;
|
||||
|
||||
|
@ -336,4 +351,23 @@ public class BreakBlockEventListener implements Listener {
|
|||
ComputerRegistry.unload(computer.getId());
|
||||
}
|
||||
}
|
||||
|
||||
private static int getDroppedExp(Block block, ItemStack tool) {
|
||||
if (!(block instanceof CraftBlock craftBlock)) return 0;
|
||||
|
||||
net.minecraft.world.level.block.state.BlockState nmsBlockState = craftBlock.getNMS();
|
||||
BlockPos pos = craftBlock.getPosition();
|
||||
ServerLevel level = craftBlock.getCraftWorld().getHandle();
|
||||
|
||||
return nmsBlockState.getBlock().getExpDrop(nmsBlockState, level, pos, CraftItemStack.asNMSCopy(tool), true);
|
||||
}
|
||||
|
||||
public static void awardBlock(Location location, int amount, Player trigger) {
|
||||
if(!(location.getWorld() instanceof CraftWorld world)) { return; }
|
||||
if(!(trigger instanceof CraftPlayer player)) { return; }
|
||||
|
||||
net.minecraft.world.entity.ExperienceOrb.award(
|
||||
world.getHandle(), new Vec3(location.x(), location.y(), location.z()), amount,
|
||||
ExperienceOrb.SpawnReason.BLOCK_BREAK, player.getHandleRaw());
|
||||
}
|
||||
}
|
||||
|
|
52
src/main/java/de/blazemcworld/blazinggames/utils/Drops.java
Normal file
52
src/main/java/de/blazemcworld/blazinggames/utils/Drops.java
Normal file
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
* Copyright 2025 The Blazing Games Maintainers
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package de.blazemcworld.blazinggames.utils;
|
||||
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
public class Drops extends ArrayList<ItemStack> {
|
||||
private int expToGive = 0;
|
||||
|
||||
public Drops() {
|
||||
super();
|
||||
}
|
||||
|
||||
public Drops(Collection<ItemStack> drops) {
|
||||
this();
|
||||
this.addAll(drops);
|
||||
}
|
||||
|
||||
public Drops(ItemStack... drops) {
|
||||
this(List.of(drops));
|
||||
}
|
||||
|
||||
public int getExperienceDropped() {
|
||||
return expToGive;
|
||||
}
|
||||
|
||||
public void addExperience(int expAmount) {
|
||||
expToGive += expAmount;
|
||||
}
|
||||
|
||||
public void setExperience(int expAmount) {
|
||||
expToGive = expAmount;
|
||||
}
|
||||
}
|
|
@ -18,6 +18,7 @@ package de.blazemcworld.blazinggames.utils;
|
|||
import de.blazemcworld.blazinggames.computing.ComputerRegistry;
|
||||
import de.blazemcworld.blazinggames.enchantments.sys.CustomEnchantments;
|
||||
import de.blazemcworld.blazinggames.enchantments.sys.EnchantmentHelper;
|
||||
import de.blazemcworld.blazinggames.events.BreakBlockEventListener;
|
||||
import de.blazemcworld.blazinggames.items.CustomItem;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.Location;
|
||||
|
@ -26,8 +27,6 @@ import org.bukkit.entity.Player;
|
|||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
|
||||
public class InventoryUtils {
|
||||
|
@ -69,17 +68,21 @@ public class InventoryUtils {
|
|||
}
|
||||
|
||||
public static void collectableDrop(Player player, Location location, ItemStack... drops) {
|
||||
collectableDrop(player, location, Arrays.asList(drops));
|
||||
collectableDrop(player, location, new Drops(drops));
|
||||
}
|
||||
|
||||
public static void collectableDrop(Player player, Location location, Collection<ItemStack> drops) {
|
||||
public static void collectableDrop(Player player, Location location, Drops drops) {
|
||||
if (EnchantmentHelper.hasActiveCustomEnchantment(player.getInventory().getItemInMainHand(), CustomEnchantments.COLLECTABLE)) {
|
||||
player.giveExp(drops.getExperienceDropped(), true);
|
||||
|
||||
for (ItemStack drop : drops) {
|
||||
for (Map.Entry<Integer, ItemStack> overflow : player.getInventory().addItem(drop).entrySet()) {
|
||||
drop(player, location, overflow.getValue());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
BreakBlockEventListener.awardBlock(location, drops.getExperienceDropped(), player);
|
||||
|
||||
for (ItemStack drop : drops) {
|
||||
drop(player, location, drop);
|
||||
}
|
||||
|
|
|
@ -68,54 +68,54 @@ public class ItemUtils {
|
|||
case WHITE_WOOL, LIGHT_GRAY_WOOL, GRAY_WOOL, BLACK_WOOL, BROWN_WOOL, RED_WOOL, ORANGE_WOOL, YELLOW_WOOL,
|
||||
LIME_WOOL, GREEN_WOOL, CYAN_WOOL, LIGHT_BLUE_WOOL, BLUE_WOOL, PURPLE_WOOL, MAGENTA_WOOL, PINK_WOOL
|
||||
-> Material.WHITE_WOOL;
|
||||
case OAK_CHEST_BOAT, SPRUCE_CHEST_BOAT, BIRCH_CHEST_BOAT, JUNGLE_CHEST_BOAT, ACACIA_CHEST_BOAT, DARK_OAK_CHEST_BOAT, MANGROVE_CHEST_BOAT, CHERRY_CHEST_BOAT, BAMBOO_CHEST_RAFT
|
||||
case OAK_CHEST_BOAT, SPRUCE_CHEST_BOAT, BIRCH_CHEST_BOAT, JUNGLE_CHEST_BOAT, ACACIA_CHEST_BOAT, DARK_OAK_CHEST_BOAT, MANGROVE_CHEST_BOAT, CHERRY_CHEST_BOAT, BAMBOO_CHEST_RAFT, PALE_OAK_CHEST_BOAT
|
||||
-> Material.OAK_CHEST_BOAT;
|
||||
case OAK_BOAT, SPRUCE_BOAT, BIRCH_BOAT, JUNGLE_BOAT, ACACIA_BOAT, DARK_OAK_BOAT, MANGROVE_BOAT, CHERRY_BOAT, BAMBOO_RAFT
|
||||
case OAK_BOAT, SPRUCE_BOAT, BIRCH_BOAT, JUNGLE_BOAT, ACACIA_BOAT, DARK_OAK_BOAT, MANGROVE_BOAT, CHERRY_BOAT, BAMBOO_RAFT, PALE_OAK_BOAT
|
||||
-> Material.OAK_BOAT;
|
||||
case OAK_WOOD, SPRUCE_WOOD, BIRCH_WOOD, JUNGLE_WOOD, ACACIA_WOOD, DARK_OAK_WOOD, MANGROVE_WOOD, CHERRY_WOOD,
|
||||
case OAK_WOOD, SPRUCE_WOOD, BIRCH_WOOD, JUNGLE_WOOD, ACACIA_WOOD, DARK_OAK_WOOD, MANGROVE_WOOD, CHERRY_WOOD, PALE_OAK_WOOD,
|
||||
WARPED_HYPHAE, CRIMSON_HYPHAE
|
||||
-> Material.OAK_WOOD;
|
||||
case STRIPPED_OAK_WOOD, STRIPPED_SPRUCE_WOOD, STRIPPED_BIRCH_WOOD, STRIPPED_JUNGLE_WOOD, STRIPPED_ACACIA_WOOD, STRIPPED_DARK_OAK_WOOD, STRIPPED_MANGROVE_WOOD, STRIPPED_CHERRY_WOOD,
|
||||
case STRIPPED_OAK_WOOD, STRIPPED_SPRUCE_WOOD, STRIPPED_BIRCH_WOOD, STRIPPED_JUNGLE_WOOD, STRIPPED_ACACIA_WOOD, STRIPPED_DARK_OAK_WOOD, STRIPPED_MANGROVE_WOOD, STRIPPED_CHERRY_WOOD, STRIPPED_PALE_OAK_WOOD,
|
||||
STRIPPED_WARPED_HYPHAE, STRIPPED_CRIMSON_HYPHAE
|
||||
-> Material.STRIPPED_OAK_WOOD;
|
||||
case OAK_LOG, SPRUCE_LOG, BIRCH_LOG, JUNGLE_LOG, ACACIA_LOG, DARK_OAK_LOG, MANGROVE_LOG, CHERRY_LOG,
|
||||
case OAK_LOG, SPRUCE_LOG, BIRCH_LOG, JUNGLE_LOG, ACACIA_LOG, DARK_OAK_LOG, MANGROVE_LOG, CHERRY_LOG, PALE_OAK_LOG,
|
||||
WARPED_STEM, CRIMSON_STEM, BAMBOO_BLOCK
|
||||
-> Material.OAK_LOG;
|
||||
case STRIPPED_OAK_LOG, STRIPPED_SPRUCE_LOG, STRIPPED_BIRCH_LOG, STRIPPED_JUNGLE_LOG, STRIPPED_ACACIA_LOG, STRIPPED_DARK_OAK_LOG, STRIPPED_MANGROVE_LOG, STRIPPED_CHERRY_LOG,
|
||||
case STRIPPED_OAK_LOG, STRIPPED_SPRUCE_LOG, STRIPPED_BIRCH_LOG, STRIPPED_JUNGLE_LOG, STRIPPED_ACACIA_LOG, STRIPPED_DARK_OAK_LOG, STRIPPED_MANGROVE_LOG, STRIPPED_CHERRY_LOG, STRIPPED_PALE_OAK_LOG,
|
||||
STRIPPED_WARPED_STEM, STRIPPED_CRIMSON_STEM, STRIPPED_BAMBOO_BLOCK
|
||||
-> Material.STRIPPED_OAK_LOG;
|
||||
case OAK_FENCE_GATE, SPRUCE_FENCE_GATE, BIRCH_FENCE_GATE, JUNGLE_FENCE_GATE, ACACIA_FENCE_GATE, DARK_OAK_FENCE_GATE, MANGROVE_FENCE_GATE, CHERRY_FENCE_GATE,
|
||||
WARPED_FENCE_GATE, CRIMSON_FENCE_GATE, BAMBOO_FENCE_GATE
|
||||
WARPED_FENCE_GATE, CRIMSON_FENCE_GATE, BAMBOO_FENCE_GATE, PALE_OAK_FENCE_GATE
|
||||
-> Material.OAK_FENCE_GATE;
|
||||
case OAK_FENCE, SPRUCE_FENCE, BIRCH_FENCE, JUNGLE_FENCE, ACACIA_FENCE, DARK_OAK_FENCE, MANGROVE_FENCE, CHERRY_FENCE,
|
||||
WARPED_FENCE, CRIMSON_FENCE, BAMBOO_FENCE
|
||||
WARPED_FENCE, CRIMSON_FENCE, BAMBOO_FENCE, PALE_OAK_FENCE
|
||||
-> Material.OAK_FENCE;
|
||||
case OAK_SIGN, SPRUCE_SIGN, BIRCH_SIGN, JUNGLE_SIGN, ACACIA_SIGN, DARK_OAK_SIGN, MANGROVE_SIGN, CHERRY_SIGN,
|
||||
WARPED_SIGN, CRIMSON_SIGN, BAMBOO_SIGN
|
||||
WARPED_SIGN, CRIMSON_SIGN, BAMBOO_SIGN, PALE_OAK_SIGN
|
||||
-> Material.OAK_SIGN;
|
||||
case OAK_HANGING_SIGN, SPRUCE_HANGING_SIGN, BIRCH_HANGING_SIGN, JUNGLE_HANGING_SIGN, ACACIA_HANGING_SIGN, DARK_OAK_HANGING_SIGN, MANGROVE_HANGING_SIGN, CHERRY_HANGING_SIGN,
|
||||
WARPED_HANGING_SIGN, CRIMSON_HANGING_SIGN, BAMBOO_HANGING_SIGN
|
||||
WARPED_HANGING_SIGN, CRIMSON_HANGING_SIGN, BAMBOO_HANGING_SIGN, PALE_OAK_HANGING_SIGN
|
||||
-> Material.OAK_HANGING_SIGN;
|
||||
case OAK_BUTTON, SPRUCE_BUTTON, BIRCH_BUTTON, JUNGLE_BUTTON, ACACIA_BUTTON, DARK_OAK_BUTTON, MANGROVE_BUTTON, CHERRY_BUTTON,
|
||||
WARPED_BUTTON, CRIMSON_BUTTON, BAMBOO_BUTTON
|
||||
WARPED_BUTTON, CRIMSON_BUTTON, BAMBOO_BUTTON, PALE_OAK_BUTTON
|
||||
-> Material.OAK_BUTTON;
|
||||
case OAK_DOOR, SPRUCE_DOOR, BIRCH_DOOR, JUNGLE_DOOR, ACACIA_DOOR, DARK_OAK_DOOR, MANGROVE_DOOR, CHERRY_DOOR,
|
||||
WARPED_DOOR, CRIMSON_DOOR, BAMBOO_DOOR
|
||||
WARPED_DOOR, CRIMSON_DOOR, BAMBOO_DOOR, PALE_OAK_DOOR
|
||||
-> Material.OAK_DOOR;
|
||||
case OAK_PRESSURE_PLATE, SPRUCE_PRESSURE_PLATE, BIRCH_PRESSURE_PLATE, JUNGLE_PRESSURE_PLATE, ACACIA_PRESSURE_PLATE, DARK_OAK_PRESSURE_PLATE, MANGROVE_PRESSURE_PLATE, CHERRY_PRESSURE_PLATE,
|
||||
WARPED_PRESSURE_PLATE, CRIMSON_PRESSURE_PLATE, BAMBOO_PRESSURE_PLATE
|
||||
WARPED_PRESSURE_PLATE, CRIMSON_PRESSURE_PLATE, BAMBOO_PRESSURE_PLATE, PALE_OAK_PRESSURE_PLATE
|
||||
-> Material.OAK_PRESSURE_PLATE;
|
||||
case OAK_SLAB, SPRUCE_SLAB, BIRCH_SLAB, JUNGLE_SLAB, ACACIA_SLAB, DARK_OAK_SLAB, MANGROVE_SLAB, CHERRY_SLAB,
|
||||
WARPED_SLAB, CRIMSON_SLAB, BAMBOO_SLAB, PETRIFIED_OAK_SLAB, BAMBOO_MOSAIC_SLAB
|
||||
WARPED_SLAB, CRIMSON_SLAB, BAMBOO_SLAB, PETRIFIED_OAK_SLAB, BAMBOO_MOSAIC_SLAB, PALE_OAK_SLAB
|
||||
-> Material.OAK_SLAB;
|
||||
case OAK_STAIRS, SPRUCE_STAIRS, BIRCH_STAIRS, JUNGLE_STAIRS, ACACIA_STAIRS, DARK_OAK_STAIRS, MANGROVE_STAIRS, CHERRY_STAIRS,
|
||||
WARPED_STAIRS, CRIMSON_STAIRS, BAMBOO_STAIRS, BAMBOO_MOSAIC_STAIRS
|
||||
WARPED_STAIRS, CRIMSON_STAIRS, BAMBOO_STAIRS, BAMBOO_MOSAIC_STAIRS, PALE_OAK_STAIRS
|
||||
-> Material.OAK_STAIRS;
|
||||
case OAK_TRAPDOOR, SPRUCE_TRAPDOOR, BIRCH_TRAPDOOR, JUNGLE_TRAPDOOR, ACACIA_TRAPDOOR, DARK_OAK_TRAPDOOR, MANGROVE_TRAPDOOR, CHERRY_TRAPDOOR,
|
||||
WARPED_TRAPDOOR, CRIMSON_TRAPDOOR, BAMBOO_TRAPDOOR
|
||||
WARPED_TRAPDOOR, CRIMSON_TRAPDOOR, BAMBOO_TRAPDOOR, PALE_OAK_TRAPDOOR
|
||||
-> Material.OAK_TRAPDOOR;
|
||||
case OAK_PLANKS, SPRUCE_PLANKS, BIRCH_PLANKS, JUNGLE_PLANKS, ACACIA_PLANKS, DARK_OAK_PLANKS, MANGROVE_PLANKS, CHERRY_PLANKS,
|
||||
WARPED_PLANKS, CRIMSON_PLANKS, BAMBOO_PLANKS, BAMBOO_MOSAIC
|
||||
WARPED_PLANKS, CRIMSON_PLANKS, BAMBOO_PLANKS, BAMBOO_MOSAIC, PALE_OAK_PLANKS
|
||||
-> Material.OAK_PLANKS;
|
||||
default -> mat;
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue