mirror of
https://github.com/Minestom/Minestom.git
synced 2024-12-27 03:27:56 +01:00
Allow for a different visual block to be placed along a custom block
This commit is contained in:
parent
365cdf7818
commit
2292261de7
@ -16,6 +16,12 @@ public interface BlockModifier {
|
||||
|
||||
void setCustomBlock(int x, int y, int z, short customBlockId, Data data);
|
||||
|
||||
void setSeparateBlocks(int x, int y, int z, short blockId, short customBlockId, Data data);
|
||||
|
||||
default void setSeparateBlocks(int x, int y, int z, short blockId, short customBlockId) {
|
||||
setSeparateBlocks(x, y, z, blockId, customBlockId, null);
|
||||
}
|
||||
|
||||
default void setBlock(int x, int y, int z, short blockId) {
|
||||
setBlock(x, y, z, blockId, null);
|
||||
}
|
||||
|
@ -71,17 +71,17 @@ public class Chunk implements Viewable {
|
||||
setBlock(x, y, z, blockId, (short) 0, data, null);
|
||||
}
|
||||
|
||||
public void UNSAFE_setCustomBlock(int x, int y, int z, short customBlockId, Data data) {
|
||||
public void UNSAFE_setCustomBlock(int x, int y, int z, short visualBlockId, short customBlockId, Data data) {
|
||||
CustomBlock customBlock = BLOCK_MANAGER.getCustomBlock(customBlockId);
|
||||
if (customBlock == null)
|
||||
throw new IllegalArgumentException("The custom block " + customBlockId + " does not exist or isn't registered");
|
||||
|
||||
UNSAFE_setCustomBlock(x, y, z, customBlock, data);
|
||||
UNSAFE_setCustomBlock(x, y, z, visualBlockId, customBlock, data);
|
||||
}
|
||||
|
||||
protected void UNSAFE_setCustomBlock(int x, int y, int z, CustomBlock customBlock, Data data) {
|
||||
protected void UNSAFE_setCustomBlock(int x, int y, int z, short visualBlockId, CustomBlock customBlock, Data data) {
|
||||
UpdateConsumer updateConsumer = customBlock.hasUpdate() ? customBlock::update : null;
|
||||
setBlock(x, y, z, customBlock.getBlockId(), customBlock.getCustomBlockId(), data, updateConsumer);
|
||||
setBlock(x, y, z, visualBlockId, customBlock.getCustomBlockId(), data, updateConsumer);
|
||||
}
|
||||
|
||||
private void setBlock(int x, int y, int z, short blockId, short customId, Data data, UpdateConsumer updateConsumer) {
|
||||
|
@ -352,4 +352,5 @@ public abstract class Instance implements BlockModifier, DataContainer {
|
||||
Set<Entity> entities = chunkEntities.get(index);
|
||||
return entities != null ? entities : new CopyOnWriteArraySet<>();
|
||||
}
|
||||
|
||||
}
|
@ -53,7 +53,13 @@ public class InstanceContainer extends Instance {
|
||||
@Override
|
||||
public void setCustomBlock(int x, int y, int z, short customBlockId, Data data) {
|
||||
CustomBlock customBlock = BLOCK_MANAGER.getCustomBlock(customBlockId);
|
||||
setBlock(x, y, z, (short) 0, customBlock, data);
|
||||
setBlock(x, y, z, customBlock.getBlockId(), customBlock, data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSeparateBlocks(int x, int y, int z, short blockId, short customBlockId, Data data) {
|
||||
CustomBlock customBlock = BLOCK_MANAGER.getCustomBlock(customBlockId);
|
||||
setBlock(x, y, z, blockId, customBlock, data);
|
||||
}
|
||||
|
||||
private synchronized void setBlock(int x, int y, int z, short blockId, CustomBlock customBlock, Data data) {
|
||||
@ -61,7 +67,6 @@ public class InstanceContainer extends Instance {
|
||||
synchronized (chunk) {
|
||||
|
||||
boolean isCustomBlock = customBlock != null;
|
||||
blockId = isCustomBlock ? customBlock.getBlockId() : blockId;
|
||||
|
||||
int index = SerializerUtils.coordToChunkIndex(x, y, z);
|
||||
|
||||
@ -76,7 +81,7 @@ public class InstanceContainer extends Instance {
|
||||
// Set the block
|
||||
if (isCustomBlock) {
|
||||
data = customBlock.createData(this, blockPosition, data);
|
||||
chunk.UNSAFE_setCustomBlock(x, y, z, customBlock, data);
|
||||
chunk.UNSAFE_setCustomBlock(x, y, z, blockId, customBlock, data);
|
||||
} else {
|
||||
chunk.UNSAFE_setBlock(x, y, z, blockId, data);
|
||||
}
|
||||
|
@ -149,6 +149,11 @@ public class SharedInstance extends Instance {
|
||||
instanceContainer.setBlock(x, y, z, customBlockId, data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSeparateBlocks(int x, int y, int z, short blockId, short customBlockId, Data data) {
|
||||
instanceContainer.setSeparateBlocks(x, y, z, blockId, customBlockId, data);
|
||||
}
|
||||
|
||||
public InstanceContainer getInstanceContainer() {
|
||||
return instanceContainer;
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ package net.minestom.server.instance.batch;
|
||||
import net.minestom.server.data.Data;
|
||||
import net.minestom.server.instance.Chunk;
|
||||
import net.minestom.server.instance.InstanceContainer;
|
||||
import net.minestom.server.instance.block.CustomBlock;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
@ -23,7 +24,7 @@ public class BlockBatch implements InstanceBatch {
|
||||
public void setBlock(int x, int y, int z, short blockId, Data data) {
|
||||
synchronized (this) {
|
||||
Chunk chunk = this.instance.getChunkAt(x, z);
|
||||
addBlockData(chunk, x, y, z, false, blockId, data);
|
||||
addBlockData(chunk, x, y, z, false, blockId, (short) 0, data);
|
||||
}
|
||||
}
|
||||
|
||||
@ -31,11 +32,20 @@ public class BlockBatch implements InstanceBatch {
|
||||
public void setCustomBlock(int x, int y, int z, short blockId, Data data) {
|
||||
synchronized (this) {
|
||||
Chunk chunk = this.instance.getChunkAt(x, z);
|
||||
addBlockData(chunk, x, y, z, true, blockId, data);
|
||||
CustomBlock customBlock = BLOCK_MANAGER.getCustomBlock(blockId);
|
||||
addBlockData(chunk, x, y, z, true, customBlock.getBlockId(), blockId, data);
|
||||
}
|
||||
}
|
||||
|
||||
private void addBlockData(Chunk chunk, int x, int y, int z, boolean customBlock, short blockId, Data data) {
|
||||
@Override
|
||||
public void setSeparateBlocks(int x, int y, int z, short blockId, short customBlockId, Data data) {
|
||||
synchronized (this) {
|
||||
Chunk chunk = this.instance.getChunkAt(x, z);
|
||||
addBlockData(chunk, x, y, z, true, blockId, customBlockId, data);
|
||||
}
|
||||
}
|
||||
|
||||
private void addBlockData(Chunk chunk, int x, int y, int z, boolean customBlock, short blockId, short customBlockId, Data data) {
|
||||
List<BlockData> blocksData = this.data.get(chunk);
|
||||
if (blocksData == null)
|
||||
blocksData = new ArrayList<>();
|
||||
@ -44,8 +54,9 @@ public class BlockBatch implements InstanceBatch {
|
||||
blockData.x = x;
|
||||
blockData.y = y;
|
||||
blockData.z = z;
|
||||
blockData.isCustomBlock = customBlock;
|
||||
blockData.hasCustomBlock = customBlock;
|
||||
blockData.blockId = blockId;
|
||||
blockData.customBlockId = customBlockId;
|
||||
blockData.data = data;
|
||||
|
||||
blocksData.add(blockData);
|
||||
@ -83,15 +94,16 @@ public class BlockBatch implements InstanceBatch {
|
||||
private class BlockData {
|
||||
|
||||
private int x, y, z;
|
||||
private boolean isCustomBlock;
|
||||
private boolean hasCustomBlock;
|
||||
private short blockId;
|
||||
private short customBlockId;
|
||||
private Data data;
|
||||
|
||||
public void apply(Chunk chunk) {
|
||||
if (!isCustomBlock) {
|
||||
if (!hasCustomBlock) {
|
||||
chunk.UNSAFE_setBlock(x, y, z, blockId, data);
|
||||
} else {
|
||||
chunk.UNSAFE_setCustomBlock(x, y, z, blockId, data);
|
||||
chunk.UNSAFE_setCustomBlock(x, y, z, blockId, customBlockId, data);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4,6 +4,7 @@ import net.minestom.server.data.Data;
|
||||
import net.minestom.server.instance.Chunk;
|
||||
import net.minestom.server.instance.ChunkGenerator;
|
||||
import net.minestom.server.instance.InstanceContainer;
|
||||
import net.minestom.server.instance.block.CustomBlock;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
@ -30,21 +31,28 @@ public class ChunkBatch implements InstanceBatch {
|
||||
|
||||
@Override
|
||||
public void setBlock(int x, int y, int z, short blockId, Data data) {
|
||||
addBlockData((byte) x, y, (byte) z, false, blockId, data);
|
||||
addBlockData((byte) x, y, (byte) z, false, blockId, (short) 0, data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCustomBlock(int x, int y, int z, short blockId, Data data) {
|
||||
addBlockData((byte) x, y, (byte) z, true, blockId, data);
|
||||
CustomBlock customBlock = BLOCK_MANAGER.getCustomBlock(blockId);
|
||||
addBlockData((byte) x, y, (byte) z, true, customBlock.getBlockId(), blockId, data);
|
||||
}
|
||||
|
||||
private void addBlockData(byte x, int y, byte z, boolean customBlock, short blockId, Data data) {
|
||||
@Override
|
||||
public void setSeparateBlocks(int x, int y, int z, short blockId, short customBlockId, Data data) {
|
||||
addBlockData((byte) x, y, (byte) z, true, blockId, customBlockId, data);
|
||||
}
|
||||
|
||||
private void addBlockData(byte x, int y, byte z, boolean customBlock, short blockId, short customBlockId, Data data) {
|
||||
BlockData blockData = new BlockData();
|
||||
blockData.x = x;
|
||||
blockData.y = y;
|
||||
blockData.z = z;
|
||||
blockData.isCustomBlock = customBlock;
|
||||
blockData.hasCustomBlock = customBlock;
|
||||
blockData.blockId = blockId;
|
||||
blockData.customBlockId = customBlockId;
|
||||
blockData.data = data;
|
||||
|
||||
this.dataList.add(blockData);
|
||||
@ -81,15 +89,16 @@ public class ChunkBatch implements InstanceBatch {
|
||||
private class BlockData {
|
||||
|
||||
private int x, y, z;
|
||||
private boolean isCustomBlock;
|
||||
private boolean hasCustomBlock;
|
||||
private short blockId;
|
||||
private short customBlockId;
|
||||
private Data data;
|
||||
|
||||
public void apply(Chunk chunk) {
|
||||
if (!isCustomBlock) {
|
||||
if (!hasCustomBlock) {
|
||||
chunk.UNSAFE_setBlock(x, y, z, blockId, data);
|
||||
} else {
|
||||
chunk.UNSAFE_setCustomBlock(x, y, z, blockId, data);
|
||||
chunk.UNSAFE_setCustomBlock(x, y, z, blockId, customBlockId, data);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -100,8 +100,7 @@ public class BlockPlacementListener {
|
||||
if (!playerBlockPlaceEvent.isCancelled() && canPlace) {
|
||||
short customBlockId = playerBlockPlaceEvent.getCustomBlockId();
|
||||
if(customBlockId != 0) {
|
||||
instance.setCustomBlock(blockPosition.getX(), blockPosition.getY(), blockPosition.getZ(), playerBlockPlaceEvent.getCustomBlockId());
|
||||
instance.refreshBlockId(blockPosition, playerBlockPlaceEvent.getBlockId());
|
||||
instance.setSeparateBlocks(blockPosition.getX(), blockPosition.getY(), blockPosition.getZ(), playerBlockPlaceEvent.getBlockId(), playerBlockPlaceEvent.getCustomBlockId());
|
||||
} else {
|
||||
instance.setBlock(blockPosition.getX(), blockPosition.getY(), blockPosition.getZ(), playerBlockPlaceEvent.getBlockId());
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user