Skip to content
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
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package net.bitbylogic.packetblocks.adapter;

import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.event.PacketListener;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
Expand All @@ -9,13 +8,17 @@
import lombok.NonNull;
import net.bitbylogic.packetblocks.PacketBlocks;
import net.bitbylogic.packetblocks.block.PacketBlock;
import net.bitbylogic.packetblocks.block.PacketBlockHolder;
import net.bitbylogic.packetblocks.block.PacketBlockManager;
import net.bitbylogic.packetblocks.event.PacketBlockBreakEvent;
import net.bitbylogic.packetblocks.event.PacketBlockStartBreakEvent;
import net.bitbylogic.packetblocks.block.PacketBlockManager;
import net.bitbylogic.packetblocks.group.PacketBlockGroup;
import net.bitbylogic.packetblocks.task.PacketBlockAnimationTask;
import net.bitbylogic.packetblocks.util.PacketBlockUtil;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;

Expand All @@ -41,19 +44,19 @@ public BlockBreakAdapter(@NonNull PacketBlockManager manager) {
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() != PacketType.Play.Client.PLAYER_DIGGING) return;

Player player = (Player) event.getPlayer();
Player player = event.getPlayer();
WrapperPlayClientPlayerDigging packet = new WrapperPlayClientPlayerDigging(event);

Vector3i position = packet.getBlockPosition();
Location location = new Location(player.getWorld(), position.getX(), position.getY(), position.getZ());
Optional<PacketBlock> optionalBlock = manager.getBlock(location);
Optional<PacketBlockHolder<?, ?>> optionalBlock = manager.getBlock(location);
if (optionalBlock.isEmpty()) return;

PacketBlock packetBlock = optionalBlock.get();
PacketBlockHolder<?, ?> packetBlock = optionalBlock.get();
if (!packetBlock.isViewer(player)) return;

int breakSpeed = packetBlock.getBreakSpeed(player);
float vanillaHardness = packetBlock.getBlockState(player).getType().getHardness();
float vanillaHardness = PacketBlockUtil.getBlockType(player, location).getHardness();

switch (packet.getAction()) {
case START_DIGGING -> handleStartDestroy(player, packetBlock, location, packet, breakSpeed, vanillaHardness);
Expand All @@ -65,7 +68,7 @@ public void onPacketReceive(PacketReceiveEvent event) {
}

private void handleStartDestroy(@NonNull Player player,
@NonNull PacketBlock packetBlock,
@NonNull PacketBlockHolder<?, ?> packetBlock,
@NonNull Location location,
@NonNull WrapperPlayClientPlayerDigging packet,
int breakSpeed,
Expand All @@ -91,7 +94,7 @@ private void handleStartDestroy(@NonNull Player player,
}

private void handleStopDestroy(@NonNull Player player,
@NonNull PacketBlock packetBlock,
@NonNull PacketBlockHolder<?, ?> packetBlock,
@NonNull Location location) {

Bukkit.getScheduler().runTask(PacketBlocks.getInstance(), () -> {
Expand All @@ -106,7 +109,26 @@ private void handleStopDestroy(@NonNull Player player,
}

if (breakEvent.isDropItems()) {
packetBlock.getBlockState(player).getBlock()
if (packetBlock instanceof PacketBlock singleBlock) {
singleBlock.getBlockState(player).getBlock()
.getDrops(player.getInventory().getItemInMainHand(), player)
.forEach(drop -> player.getWorld().dropItemNaturally(location, drop));
return;
}

if(!(packetBlock instanceof PacketBlockGroup group)) {
return;
}

Optional<BlockData> optionalBlockData = group.getDataAt(player, location);

if (optionalBlockData.isEmpty()) {
return;
}

BlockData blockData = optionalBlockData.get();

blockData.createBlockState().copy(location).getBlock()
.getDrops(player.getInventory().getItemInMainHand(), player)
.forEach(drop -> player.getWorld().dropItemNaturally(location, drop));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.github.retrooper.packetevents.util.Vector3i;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerBlockPlacement;
import lombok.RequiredArgsConstructor;
import net.bitbylogic.packetblocks.block.PacketBlockHolder;
import net.bitbylogic.packetblocks.block.PacketBlockManager;
import net.bitbylogic.packetblocks.block.PacketBlock;
import net.bitbylogic.packetblocks.util.PacketBlockUtil;
Expand Down Expand Up @@ -64,13 +65,13 @@ public void onPacketReceive(PacketReceiveEvent event) {
return;
}

Optional<PacketBlock> optionalBlock = manager.getBlock(location);
Optional<PacketBlockHolder<?, ?>> optionalBlock = manager.getBlock(location);

if (optionalBlock.isEmpty()) {
return;
}

PacketBlock packetBlock = optionalBlock.get();
PacketBlockHolder<?, ?> packetBlock = optionalBlock.get();

if (!packetBlock.isViewer(player)) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,11 @@
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerMultiBlockChange;
import lombok.RequiredArgsConstructor;
import net.bitbylogic.packetblocks.block.PacketBlock;
import net.bitbylogic.packetblocks.block.PacketBlockHolder;
import net.bitbylogic.packetblocks.block.PacketBlockManager;
import net.bitbylogic.packetblocks.group.PacketBlockGroup;
import org.bukkit.Location;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player;

import java.util.ArrayList;
Expand Down Expand Up @@ -38,11 +41,28 @@ public void onPacketSend(PacketSendEvent event) {
blockPos.getZ()
);

Optional<PacketBlock> optionalBlock = manager.getBlock(bukkitLoc);
Optional<PacketBlockHolder<?, ?>> optionalBlock = manager.getBlock(bukkitLoc);

if (optionalBlock.isPresent() && optionalBlock.get().isViewer(player)) {
PacketBlock block = optionalBlock.get();
packet.setBlockState(WrappedBlockState.getByString(block.getBlockState(player).getBlockData().getAsString()));
PacketBlockHolder<?, ?> block = optionalBlock.get();

if(block instanceof PacketBlock singleBlock) {
packet.setBlockState(WrappedBlockState.getByString(singleBlock.getData(player).getAsString()));
return;
}

if(!(block instanceof PacketBlockGroup group)) {
return;
}

Optional<BlockData> optionalBlockData = group.getDataAt(player, bukkitLoc);

if (optionalBlockData.isEmpty()) {
return;
}

BlockData blockData = optionalBlockData.get();
packet.setBlockState(WrappedBlockState.getByString(blockData.getAsString()));
}
}

Expand All @@ -52,16 +72,36 @@ else if (event.getPacketType() == PacketType.Play.Server.MULTI_BLOCK_CHANGE) {
WrapperPlayServerMultiBlockChange.EncodedBlock[] blocks = packet.getBlocks();
List<WrapperPlayServerMultiBlockChange.EncodedBlock> modifiedBlocks = new ArrayList<>();

for (WrapperPlayServerMultiBlockChange.EncodedBlock block : blocks) {
Location loc = new Location(player.getWorld(), block.getX(), block.getY(), block.getZ());
Optional<PacketBlock> pb = manager.getBlock(loc);
for (WrapperPlayServerMultiBlockChange.EncodedBlock encodedBlock : blocks) {
Location loc = new Location(player.getWorld(), encodedBlock.getX(), encodedBlock.getY(), encodedBlock.getZ());
Optional<PacketBlockHolder<?, ?>> pb = manager.getBlock(loc);

if (pb.isPresent() && pb.get().isViewer(player)) {
PacketBlockHolder<?, ?> block = pb.get();

if(block instanceof PacketBlock singleBlock) {
modifiedBlocks.add(new WrapperPlayServerMultiBlockChange.EncodedBlock(
WrappedBlockState.getByString(singleBlock.getData(player).getAsString()),
encodedBlock.getX(), encodedBlock.getY(), encodedBlock.getZ()));
return;
}

if(!(block instanceof PacketBlockGroup group)) {
return;
}

Optional<BlockData> optionalBlockData = group.getDataAt(player, loc);

if (optionalBlockData.isEmpty()) {
return;
}

BlockData blockData = optionalBlockData.get();
modifiedBlocks.add(new WrapperPlayServerMultiBlockChange.EncodedBlock(
WrappedBlockState.getByString(pb.get().getBlockState(player).getBlockData().getAsString()),
block.getX(), block.getY(), block.getZ()));
WrappedBlockState.getByString(blockData.getAsString()),
encodedBlock.getX(), encodedBlock.getY(), encodedBlock.getZ()));
} else {
modifiedBlocks.add(block);
modifiedBlocks.add(encodedBlock);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,17 @@
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerChunkData;
import lombok.RequiredArgsConstructor;
import net.bitbylogic.packetblocks.block.PacketBlock;
import net.bitbylogic.packetblocks.block.PacketBlockHolder;
import net.bitbylogic.packetblocks.block.PacketBlockManager;
import net.bitbylogic.packetblocks.group.PacketBlockGroup;
import net.bitbylogic.utils.location.WorldPosition;
import org.bukkit.Location;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@RequiredArgsConstructor
public class ChunkLoadAdapter implements PacketListener {
Expand All @@ -32,38 +36,71 @@ public void onPacketSend(PacketSendEvent event) {
int chunkX = packet.getColumn().getX();
int chunkZ = packet.getColumn().getZ();

List<PacketBlock> blocks = new ArrayList<>(manager.getBlocks(player.getWorld(), chunkX, chunkZ).values());
List<PacketBlockHolder<?, ?>> blocks = new ArrayList<>(manager.getBlocks(player.getWorld(), chunkX, chunkZ).values());
if (blocks.isEmpty()) return;

BaseChunk[] sections = packet.getColumn().getChunks();
int absMinHeight = Math.abs(player.getWorld().getMinHeight());

for (PacketBlock packetBlock : blocks) {
for (PacketBlockHolder<?, ?> packetBlock : blocks) {
if (!packetBlock.isViewer(player)) continue;

Location loc = packetBlock.getLocation();
int xInChunk = loc.getBlockX() & 0xF;
int y = loc.getBlockY();
int zInChunk = loc.getBlockZ() & 0xF;
if(packetBlock instanceof PacketBlock singleBlock) {
Location loc = singleBlock.getLocation();
int xInChunk = loc.getBlockX() & 0xF;
int y = loc.getBlockY();
int zInChunk = loc.getBlockZ() & 0xF;

int sectionIndex = (y >> 4) + (absMinHeight >> 4);
int yInSection = y & 0xF;
int sectionIndex = (y >> 4) + (absMinHeight >> 4);
int yInSection = y & 0xF;

if (sectionIndex < 0 || sectionIndex >= sections.length) continue;
if (sectionIndex < 0 || sectionIndex >= sections.length) continue;

BaseChunk section = sections[sectionIndex];
if (section == null) continue;
BaseChunk section = sections[sectionIndex];
if (section == null) continue;

BlockData bukkitData = packetBlock.getBlockState(player).getBlockData();
WrappedBlockState wrappedState = WrappedBlockState.getByString(bukkitData.getAsString());
BlockData bukkitData = singleBlock.getData(player);
WrappedBlockState wrappedState = WrappedBlockState.getByString(bukkitData.getAsString());

section.set(
PacketEvents.getAPI().getServerManager().getVersion().toClientVersion(),
xInChunk,
yInSection,
zInChunk,
wrappedState.getGlobalId()
);
section.set(
PacketEvents.getAPI().getServerManager().getVersion().toClientVersion(),
xInChunk,
yInSection,
zInChunk,
wrappedState.getGlobalId()
);

continue;
}

if(!(packetBlock instanceof PacketBlockGroup group)) {
continue;
}

for (Map.Entry<WorldPosition, BlockData> entry : group.getData().entrySet()) {
Location loc = group.getCachedLocations().get(entry.getKey());
int xInChunk = loc.getBlockX() & 0xF;
int y = loc.getBlockY();
int zInChunk = loc.getBlockZ() & 0xF;

int sectionIndex = (y >> 4) + (absMinHeight >> 4);
int yInSection = y & 0xF;

if (sectionIndex < 0 || sectionIndex >= sections.length) continue;

BaseChunk section = sections[sectionIndex];
if (section == null) continue;

WrappedBlockState wrappedState = WrappedBlockState.getByString(entry.getValue().getAsString());

section.set(
PacketEvents.getAPI().getServerManager().getVersion().toClientVersion(),
xInChunk,
yInSection,
zInChunk,
wrappedState.getGlobalId()
);
}
}
}

Expand Down
Loading