use of net.minecraft.server.v1_15_R1.IBlockData in project MechanicsMain by WeaponMechanics.
the class v1_12_R1 method getHitBox.
@Override
public HitBox getHitBox(org.bukkit.block.Block block) {
if (block.isEmpty() || block.isLiquid())
return null;
WorldServer worldServer = ((CraftWorld) block.getWorld()).getHandle();
BlockPosition blockPosition = new BlockPosition(block.getX(), block.getY(), block.getZ());
IBlockData blockData = worldServer.getType(blockPosition);
Block nmsBlock = blockData.getBlock();
// Passable block check -> false means passable (thats why !)
if (!(blockData.d(worldServer, blockPosition) != Block.k && nmsBlock.a(blockData, false)))
return null;
AxisAlignedBB aabb = blockData.e(worldServer, blockPosition);
// 1.12 -> e
// 1.11 -> d
// 1.9 - 1.10 -> c
int x = blockPosition.getX(), y = blockPosition.getY(), z = blockPosition.getZ();
HitBox hitBox = new HitBox(x + aabb.a, y + aabb.b, z + aabb.c, x + aabb.d, y + aabb.e, z + aabb.f);
hitBox.setBlockHitBox(block);
return hitBox;
}
use of net.minecraft.server.v1_15_R1.IBlockData in project THP-Engine by TheHollowPlanetMC.
the class PacketManager method sendClearChunkMultiBlockChangePacketAtPrimaryThread.
public static void sendClearChunkMultiBlockChangePacketAtPrimaryThread(Player player, ParallelChunk parallelChunk, NMSHandler nmsHandler) {
if (!Bukkit.isPrimaryThread())
throw new IllegalStateException("DO NOT CALL FROM ASYNC THREAD!");
org.bukkit.World world = Bukkit.getWorld(parallelChunk.getWorld().getName());
if (world == null)
return;
if (player.getWorld() != world)
return;
List<Short> coordList = new ArrayList<>();
boolean has = false;
for (int sectionIndex = 0; sectionIndex < 16; sectionIndex++) {
SectionTypeArray sectionTypeArray = parallelChunk.getSectionTypeArray(sectionIndex);
if (sectionTypeArray == null)
continue;
int finalSectionIndex = sectionIndex;
boolean notEmpty = sectionTypeArray.threadsafeIteration((x, y, z, iBlockData) -> {
short loc = (short) (x << 12 | z << 8 | (y + (finalSectionIndex << 4)));
coordList.add(loc);
});
if (notEmpty)
has = true;
}
if (!has)
return;
if (coordList.size() == 0)
return;
org.bukkit.Chunk chunk = world.getChunkAt(parallelChunk.getChunkX(), parallelChunk.getChunkZ());
net.minecraft.server.v1_15_R1.Chunk nmsChunk = ((CraftChunk) chunk).getHandle();
short[] array = new short[coordList.size()];
for (int i = 0; i < coordList.size(); i++) {
array[i] = coordList.get(i);
}
PacketPlayOutMultiBlockChange packet = new PacketPlayOutMultiBlockChange(coordList.size(), array, nmsChunk);
nmsHandler.sendPacket(player, packet);
}
use of net.minecraft.server.v1_15_R1.IBlockData in project Movecraft by APDevTeam.
the class IWorldHandler method translateCraft.
@Override
public void translateCraft(@NotNull Craft craft, @NotNull MovecraftLocation displacement, @NotNull org.bukkit.World world) {
// TODO: Add support for rotations
// A craftTranslateCommand should only occur if the craft is moving to a valid position
// *******************************************
// * Step one: Convert to Positions *
// *******************************************
BlockPosition translateVector = locationToPosition(displacement);
List<BlockPosition> positions = new ArrayList<>(craft.getHitBox().size());
craft.getHitBox().forEach((movecraftLocation) -> positions.add(locationToPosition((movecraftLocation)).b(translateVector)));
WorldServer oldNativeWorld = ((CraftWorld) craft.getWorld()).getHandle();
World nativeWorld = ((CraftWorld) world).getHandle();
// *******************************************
// * Step two: Get the tiles *
// *******************************************
List<TileHolder> tiles = new ArrayList<>();
// get the tiles
for (int i = 0, positionsSize = positions.size(); i < positionsSize; i++) {
BlockPosition position = positions.get(i);
if (oldNativeWorld.getType(position) == Blocks.AIR.getBlockData())
continue;
// TileEntity tile = nativeWorld.removeTileEntity(position);
TileEntity tile = removeTileEntity(oldNativeWorld, position);
if (tile == null)
continue;
// get the nextTick to move with the tile
// nativeWorld.capturedTileEntities.remove(position);
// nativeWorld.getChunkAtWorldCoords(position).getTileEntities().remove(position);
tiles.add(new TileHolder(tile, tickProvider.getNextTick(oldNativeWorld, position), position));
}
// *******************************************
// * Step three: Translate all the blocks *
// *******************************************
// blockedByWater=false means an ocean-going vessel
// TODO: Simplify
// TODO: go by chunks
// TODO: Don't move unnecessary blocks
// get the blocks and translate the positions
List<IBlockData> blockData = new ArrayList<>();
List<BlockPosition> newPositions = new ArrayList<>();
for (int i = 0, positionsSize = positions.size(); i < positionsSize; i++) {
BlockPosition position = positions.get(i);
blockData.add(oldNativeWorld.getType(position));
newPositions.add(position.a(translateVector));
}
// create the new block
for (int i = 0, positionSize = newPositions.size(); i < positionSize; i++) {
setBlockFast(nativeWorld, newPositions.get(i), blockData.get(i));
}
// TODO: go by chunks
for (int i = 0, tilesSize = tiles.size(); i < tilesSize; i++) {
TileHolder tileHolder = tiles.get(i);
moveTileEntity(nativeWorld, tileHolder.getTilePosition().a(translateVector), tileHolder.getTile());
if (tileHolder.getNextTick() == null)
continue;
final long currentTime = nativeWorld.worldData.getTime();
nativeWorld.getBlockTickList().a(tileHolder.getNextTick().a.a(translateVector), (Block) tileHolder.getNextTick().b(), (int) (tileHolder.getNextTick().b - currentTime), tileHolder.getNextTick().c);
}
// *******************************************
// * Step five: Destroy the leftovers *
// *******************************************
List<BlockPosition> deletePositions = positions;
if (oldNativeWorld == nativeWorld)
deletePositions = CollectionUtils.filter(positions, newPositions);
for (int i = 0, deletePositionsSize = deletePositions.size(); i < deletePositionsSize; i++) {
BlockPosition position = deletePositions.get(i);
setBlockFast(oldNativeWorld, position, Blocks.AIR.getBlockData());
}
}
use of net.minecraft.server.v1_15_R1.IBlockData in project Movecraft by APDevTeam.
the class IWorldHandler method rotateCraft.
@Override
public void rotateCraft(@NotNull Craft craft, @NotNull MovecraftLocation originPoint, @NotNull MovecraftRotation rotation) {
// *******************************************
// * Step one: Convert to Positions *
// *******************************************
HashMap<BlockPosition, BlockPosition> rotatedPositions = new HashMap<>();
MovecraftRotation counterRotation = rotation == MovecraftRotation.CLOCKWISE ? MovecraftRotation.ANTICLOCKWISE : MovecraftRotation.CLOCKWISE;
for (MovecraftLocation newLocation : craft.getHitBox()) {
rotatedPositions.put(locationToPosition(MathUtils.rotateVec(counterRotation, newLocation.subtract(originPoint)).add(originPoint)), locationToPosition(newLocation));
}
// *******************************************
// * Step two: Get the tiles *
// *******************************************
WorldServer nativeWorld = ((CraftWorld) craft.getWorld()).getHandle();
List<TileHolder> tiles = new ArrayList<>();
// get the tiles
for (BlockPosition position : rotatedPositions.keySet()) {
// TileEntity tile = nativeWorld.removeTileEntity(position);
TileEntity tile = removeTileEntity(nativeWorld, position);
if (tile == null)
continue;
tile.a(ROTATION[rotation.ordinal()]);
// get the nextTick to move with the tile
tiles.add(new TileHolder(tile, tickProvider.getNextTick(nativeWorld, position), position));
}
// *******************************************
// * Step three: Translate all the blocks *
// *******************************************
// blockedByWater=false means an ocean-going vessel
// TODO: Simplify
// TODO: go by chunks
// TODO: Don't move unnecessary blocks
// get the blocks and rotate them
HashMap<BlockPosition, IBlockData> blockData = new HashMap<>();
for (BlockPosition position : rotatedPositions.keySet()) {
blockData.put(position, nativeWorld.getType(position).a(ROTATION[rotation.ordinal()]));
}
// create the new block
for (Map.Entry<BlockPosition, IBlockData> entry : blockData.entrySet()) {
setBlockFast(nativeWorld, rotatedPositions.get(entry.getKey()), entry.getValue());
}
// TODO: go by chunks
for (TileHolder tileHolder : tiles) {
moveTileEntity(nativeWorld, rotatedPositions.get(tileHolder.getTilePosition()), tileHolder.getTile());
if (tileHolder.getNextTick() == null)
continue;
final long currentTime = nativeWorld.worldData.getTime();
nativeWorld.getBlockTickList().a(rotatedPositions.get(tileHolder.getNextTick().a), (Block) tileHolder.getNextTick().b(), (int) (tileHolder.getNextTick().b - currentTime), tileHolder.getNextTick().c);
}
// *******************************************
// * Step five: Destroy the leftovers *
// *******************************************
// TODO: add support for pass-through
Collection<BlockPosition> deletePositions = CollectionUtils.filter(rotatedPositions.keySet(), rotatedPositions.values());
for (BlockPosition position : deletePositions) {
setBlockFast(nativeWorld, position, Blocks.AIR.getBlockData());
}
}
use of net.minecraft.server.v1_15_R1.IBlockData in project Movecraft by APDevTeam.
the class IWorldHandler method translateCraft.
@Override
public void translateCraft(@NotNull Craft craft, @NotNull MovecraftLocation displacement, @NotNull org.bukkit.World world) {
// TODO: Add support for rotations
// A craftTranslateCommand should only occur if the craft is moving to a valid position
// *******************************************
// * Step one: Convert to Positions *
// *******************************************
BlockPosition translateVector = locationToPosition(displacement);
List<BlockPosition> positions = new ArrayList<>(craft.getHitBox().size());
craft.getHitBox().forEach((movecraftLocation) -> positions.add(locationToPosition((movecraftLocation)).b(translateVector)));
WorldServer oldNativeWorld = ((CraftWorld) craft.getWorld()).getHandle();
World nativeWorld = ((CraftWorld) world).getHandle();
// *******************************************
// * Step two: Get the tiles *
// *******************************************
List<TileHolder> tiles = new ArrayList<>();
// get the tiles
for (int i = 0, positionsSize = positions.size(); i < positionsSize; i++) {
BlockPosition position = positions.get(i);
if (oldNativeWorld.getType(position) == Blocks.AIR.getBlockData())
continue;
// TileEntity tile = nativeWorld.removeTileEntity(position);
TileEntity tile = removeTileEntity(oldNativeWorld, position);
if (tile == null)
continue;
// get the nextTick to move with the tile
// nativeWorld.capturedTileEntities.remove(position);
// nativeWorld.getChunkAtWorldCoords(position).getTileEntities().remove(position);
tiles.add(new TileHolder(tile, tickProvider.getNextTick(oldNativeWorld, position), position));
}
// *******************************************
// * Step three: Translate all the blocks *
// *******************************************
// blockedByWater=false means an ocean-going vessel
// TODO: Simplify
// TODO: go by chunks
// TODO: Don't move unnecessary blocks
// get the blocks and translate the positions
List<IBlockData> blockData = new ArrayList<>();
List<BlockPosition> newPositions = new ArrayList<>();
for (int i = 0, positionsSize = positions.size(); i < positionsSize; i++) {
BlockPosition position = positions.get(i);
blockData.add(oldNativeWorld.getType(position));
newPositions.add(position.a(translateVector));
}
// create the new block
for (int i = 0, positionSize = newPositions.size(); i < positionSize; i++) {
setBlockFast(nativeWorld, newPositions.get(i), blockData.get(i));
}
// TODO: go by chunks
for (int i = 0, tilesSize = tiles.size(); i < tilesSize; i++) {
TileHolder tileHolder = tiles.get(i);
moveTileEntity(nativeWorld, tileHolder.getTilePosition().a(translateVector), tileHolder.getTile());
if (tileHolder.getNextTick() == null)
continue;
final long currentTime = nativeWorld.worldData.getTime();
nativeWorld.getBlockTickList().a(tileHolder.getNextTick().a.a(translateVector), (Block) tileHolder.getNextTick().b(), (int) (tileHolder.getNextTick().b - currentTime), tileHolder.getNextTick().c);
}
// *******************************************
// * Step five: Destroy the leftovers *
// *******************************************
List<BlockPosition> deletePositions = positions;
if (oldNativeWorld == nativeWorld)
deletePositions = CollectionUtils.filter(positions, newPositions);
for (int i = 0, deletePositionsSize = deletePositions.size(); i < deletePositionsSize; i++) {
BlockPosition position = deletePositions.get(i);
setBlockFast(oldNativeWorld, position, Blocks.AIR.getBlockData());
}
}
Aggregations